Problem: Kolya has a turtle and a field of size 2 × n. The field rows are numbered from 1 to 2 from top to bottom, while the columns are numbered from 1 to n from left to right.

Suppose in each cell of the field there is a lettuce leaf. The energy value of lettuce leaf in row i and column j is equal to a_{i,j}. The turtle is initially in the top left cell and wants to reach the bottom right cell. The turtle can only move right and down and among all possible ways it will choose a way, maximizing the total energy value of lettuce leaves (in case there are several such paths, it will choose any of them).

Kolya is afraid, that if turtle will eat too much lettuce, it can be bad for its health. So he wants to reorder lettuce leaves in the field, so that the energetic cost of leaves eaten by turtle will be minimized.

Input

The first line contains an integer n (2 ≤ n ≤ 25) — the length of the field.

The second line contains n integers a_{1, i} (0 ≤ a_{1, i} ≤ 50 000), the energetic cost of lettuce leaves in the first row of the field.

The third line contains n integers a_{2, i} (0 ≤ a_{2, i} ≤ 50 000), the energetic cost of lettuce leaves in the second row of the field.

Output

Print two lines with n integers in each — the optimal reordering of lettuce from the input data.

In case there are several optimal ways to reorder lettuce, print any of them.

Examples

Input


2
1 4
2 3


Output


1 3 
4 2 


Input


3
0 0 0
0 0 0


Output


0 0 0 
0 0 0 


Input


3
1 0 1
0 0 0


Output


0 0 1
0 1 0

Note

In the first example, after reordering, the turtle will eat lettuce with total energetic cost 1+4+2 = 7.

In the second example, the turtle will eat lettuce with energetic cost equal 0.

In the third example, after reordering, the turtle will eat lettuce with total energetic cost equal 1.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int nmax = 51;
int n;
int inp[nmax];
int best_score = 1e9;
int outp[2][nmax];
bitset<25 * 50000 + 42> on[26][26], idle;
int mem_00, mem_1n, extra;
int cur_table[2][nmax];
void rec(int pos, int upper, int lower, int score_0, int score_1) {
  if (best_score <= score_0 + extra || best_score <= score_1 + extra) return;
  if (pos == 2 * n + 1) {
    best_score = max(score_0, score_1) + extra;
    for (int i = 0; i < 2; i++)
      for (int j = 1; j <= n; j++) outp[i][j] = cur_table[i][j];
    return;
  }
  if (pos == mem_00 || pos == mem_1n)
    rec(pos + 1, upper, lower, score_0, score_1);
  if (on[lower][upper][score_0]) return;
  on[lower][upper][score_0] = 1;
  if (mem_00 < pos && upper != n) {
    cur_table[0][upper + 1] = inp[pos];
    rec(pos + 1, upper + 1, lower, score_0 + inp[pos], score_1);
  }
  if (mem_1n < pos && lower != 1) {
    cur_table[1][lower - 1] = inp[pos];
    rec(pos + 1, upper, lower - 1, score_0, score_1 + inp[pos]);
  }
}
void solve(int main_1n) {
  int main_00 = 1;
  mem_00 = main_00;
  mem_1n = main_1n;
  extra = inp[mem_00] + inp[mem_1n];
  cur_table[0][1] = inp[mem_00];
  int sum = 0;
  for (int i = 2; i < main_1n; i++) {
    cur_table[0][i] = inp[i];
    sum += inp[i];
  }
  cur_table[1][n] = inp[mem_1n];
  for (int i = main_1n; i <= n; i++)
    for (int j = 1; j <= n; j++) on[i][j] = idle;
  rec(1, 1, n, 0, 0);
}
int main() {
  scanf("%i", &n);
  for (int i = 1; i <= 2 * n; i++) scanf("%i", &inp[i]);
  sort(inp + 1, inp + 2 * n + 1);
  for (int i = 2; i <= n + 1; i++) solve(i);
  for (int i = 0; i < 2; i++) {
    for (int j = 1; j <= n; j++) printf("%i ", outp[i][j]);
    printf("\n");
  }
  return 0;
}