#include <bits/stdc++.h>
using namespace std;
int val[60];
int n;
int grid[2][60];
int mask1[25][1200008 + 1], mask2[25][1200008 + 1];
void solve(int l, int r, int mask[][1200008 + 1]) {
  memset(mask, -1, sizeof mask);
  for (int i = 0; i <= 24; i++)
    for (int j = 0; j < 1200008 + 1; j++) mask[i][j] = -1;
  for (int i = 0; i < (1 << r - l); i++) {
    int s = 0;
    for (int j = 0; j < r - l; j++)
      if ((1 << j) & i) s += val[j + l];
    mask[__builtin_popcount(i)][s] = i;
  }
}
signed main() {
  scanf("%d", &n);
  n = n * 2;
  for (int i = 0; i < n; i++) scanf("%d", &val[i]);
  sort(val, val + n);
  int sum = 0;
  int base = val[0] + val[1];
  grid[0][0] = val[0], grid[1][n / 2 - 1] = val[1];
  n -= 2;
  for (int i = 0; i < n; i++) val[i] = val[i + 2], sum += val[i];
  solve(0, n / 2, mask1);
  solve(n / 2, n, mask2);
  int ans = 1e9;
  long long ansmask = 0;
  for (int a = 0; a <= n / 2; a++) {
    int b = n / 2 - a;
    int j = 1200008;
    while (j >= 0 and mask2[b][j] == -1) j--;
    for (int i = 0; j >= 0 and i <= 1200008; i++)
      if (mask1[a][i] > -1) {
        while (j >= 0 and (j + i) * 2 > sum) j--;
        while (j >= 0 and mask2[b][j] == -1) j--;
        if (j < 0) break;
        if (sum - (i + j) * 2 < ans) {
          ans = sum - (i + j) * 2;
          ansmask = (1ll * mask2[b][j]) << (n / 2);
          ansmask += mask1[a][i];
        }
      }
  }
  ans = (sum + ans) / 2;
  vector<int> v1, v2;
  for (int i = 0; i < n; i++)
    if ((1ll << i) & ansmask)
      v1.push_back(val[i]);
    else
      v2.push_back(val[i]);
  sort(v1.begin(), v1.end());
  sort(v2.begin(), v2.end());
  reverse(v2.begin(), v2.end());
  n += 2;
  for (int i = 1; i < n / 2; i++) grid[0][i] = v1[i - 1];
  for (int i = 0; i < n / 2 - 1; i++) grid[1][i] = v2[i];
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < n / 2; j++) cout << grid[i][j] << " ";
    cout << "\n";
  }
  return 0;
}
