/* GCC */

#define maxN 100000

#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;

int all[maxN * 2], n; // Усі числа із вхідного файлу та їхня кількість
vector<int> p[2]; // Дві прогресії, які будуватиме програма

// Функція test пробує розбити послідовність на дві прогресії за припущення, що в однієї
// з прогресій (яку умовно назвемо першою) перший елемент дорівнює first, а другий — second.
// Якщо розбити послідовність на прогресії вдалося, повертає true, інакше — false. У разі
// успіху заповнює вектори p[0] та p[1] (глобальні змінні) членами відповідних прогресій.
bool test(int first, int second)
{
    p[0].clear(); // Очищуємо вектори перед новим використанням
    p[1].clear();
    int a[2], d[2]; // Перші члени та різниці прогресій відповідно
    a[0] = first;
    d[0] = second - first;
    a[1] = d[1] = 0; // Нулі означають, що поки що інформації про другу прогресію нема
    for (int i = 0; i < 2 * n; i++) // Намагаємось припасувати кожне число до однієї з прогресій
        if (p[0].size() < n && all[i] == a[0] + d[0] * p[0].size()) // Якщо число підходить до
            p[0].push_back(all[i]);        // першої прогресії, його необхідно додати саме в неї
        else // Інакше число має належати другій прогресії:
        {
            if (a[1] == 0)     // Якщо це перший елемент другої прогресії, на який ми натрапили,
                a[1] = all[i]; // запам’ятовуємо його
            else if (d[1] == 0)       // Якщо це другий елемент прогресії, на який ми натрапили,
                d[1] = all[i] - a[1]; // то обраховуємо і запам’ятовуємо різницю прогресії
            else if (p[1].size() >= n || all[i] != a[1] + d[1] * p[1].size()) // Якщо ж інформа-
                return false; // ція про прогресію вже відома, але число не підходить, виходимо
            p[1].push_back(all[i]); // Якщо ми не вийшли, то елемент слід додати до прогресії
        }
    return true; // Якщо ми досі не вийшли з функції, то побудувати прогресії вдалося
}

int main()
{
    freopen("stamps.in", "r", stdin);
    freopen("stamps.out", "w", stdout);

    // Зчитуємо дані:
    scanf("%d", &n);
    for (int i = 0; i < 2 * n; i++)
        scanf("%d", &all[i]);

    sort(all, all + 2 * n); // Сортуємо числа обох прогресій

    // Послідовно перевіряємо гіпотези про те, що найменшими елементами однієї з прогресій
    // є деякі два з найменших трьох чисел відсортованої послідовності (оператори || потрібні,
    // щоб після виявлення істинної гіпотези не продовжувати розгляд інших):
    test(all[0], all[1]) || test(all[0], all[2]) || test(all[1], all[2]);

    if (p[0][0] > p[1][0]) // Забезпечуємо правильний порядок виведення
        swap(p[0], p[1]);

    // Виводимо прогресії:
    for (int i = 0; i < 2; i++)
        for (int j = 0; j < n; j++)
            printf(j < n - 1 ? "%d " : "%d\n", p[i][j]);

    return 0;
}
