#include <bits/stdc++.h>
using namespace std;
namespace zyt {
template <typename T>
inline bool read(T &x) {
  char c;
  bool f = false;
  x = 0;
  do c = getchar();
  while (c != EOF && c != '-' && !isdigit(c));
  if (c == EOF) return false;
  if (c == '-') f = true, c = getchar();
  do x = x * 10 + c - '0', c = getchar();
  while (isdigit(c));
  if (f) x = -x;
  return true;
}
template <typename T>
inline void write(T x) {
  static char buf[20];
  char *pos = buf;
  if (x < 0) putchar('-'), x = -x;
  do *pos++ = x % 10 + '0';
  while (x /= 10);
  while (pos > buf) putchar(*--pos);
}
const int N = 26, M = 1.25e6 + 10, INF = 0x3f3f3f3f;
bitset<M> f[N << 1][N];
int n, arr[N << 1], sum;
bool vis[N << 1];
int work() {
  read(n);
  for (int i = 1; i <= (n << 1); i++) read(arr[i]), sum += arr[i];
  sort(arr + 1, arr + (n << 1) + 1);
  sum -= arr[1] + arr[2];
  f[2][0].set(0);
  for (int i = 3; i <= (n << 1); i++) {
    f[i][0] = f[i - 1][0];
    for (int j = 1; j < n; j++)
      f[i][j] |= ((f[i - 1][j - 1] << arr[i]) | f[i - 1][j]);
  }
  pair<int, int> ans = pair<int, int>(INF, 0);
  for (int i = 0; i < M; i++)
    if (f[n << 1][n - 1][i]) ans = min(ans, pair<int, int>(max(i, sum - i), i));
  int now = n - 1;
  for (int i = (n << 1); i > 2; i--)
    if (now && ans.second >= arr[i] && f[i - 1][now - 1][ans.second - arr[i]])
      ans.second -= arr[i], vis[i] = true, --now;
  vis[1] = true;
  for (int i = 1; i <= (n << 1); i++)
    if (vis[i]) write(arr[i]), putchar(' ');
  putchar('\n');
  for (int i = (n << 1); i > 0; i--)
    if (!vis[i]) write(arr[i]), putchar(' ');
  return 0;
}
}  // namespace zyt
int main() { return zyt::work(); }
