#include <bits/stdc++.h>
using namespace std;
template <class S, class T>
ostream& operator<<(ostream& o, const pair<S, T>& p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T>
ostream& operator<<(ostream& o, const vector<T>& vc) {
  o << "{";
  for (const T& v : vc) o << v << ",";
  o << "}";
  return o;
}
using ll = long long;
template <class T>
using V = vector<T>;
template <class T>
using VV = vector<vector<T>>;
constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n - 1); }
const int MX = 50000 * 25;
int dp[26][MX + 10];
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(20);
  int N;
  cin >> N;
  V<int> a(N + N);
  for (int i = 0; i < (int)(N + N); i++) cin >> a[i];
  sort(a.begin(), a.end());
  for (int i = 0; i < (int)(26); i++)
    for (int j = 0; j < (int)(MX + 10); j++) dp[i][j] = -1;
  dp[0][0] = 0;
  int S = 0;
  for (int i = 2; i < N + N; i++) {
    S += a[i];
    for (int k = N; k > 0; k--) {
      for (int v = MX; v >= a[i]; v--)
        if (dp[k][v] == -1 && dp[k - 1][v - a[i]] >= 0) {
          dp[k][v] = i;
        }
    }
  }
  int best = 0;
  for (int v = 0; v < (int)(MX); v++)
    if (dp[N - 1][v] != -1 && max(best, S - best) > max(v, S - v)) best = v;
  V<bool> U(N + N);
  U[0] = true;
  for (int t = 0; t < (int)(N - 1); t++) {
    int use = dp[N - 1 - t][best];
    U[use] = true;
    best -= a[use];
  }
  assert(best == 0);
  V<int> A, B;
  for (int i = 0; i < (int)(N + N); i++) {
    if (U[i])
      A.push_back(a[i]);
    else
      B.push_back(a[i]);
  }
  reverse(B.begin(), B.end());
  for (int x : A) cout << x << " ";
  cout << endl;
  for (int x : B) cout << x << " ";
  cout << endl;
}
