#include <stdio.h>
#include <stdbool.h>
// 快速排序
void quickSort(int* arr, int left, int right) {
if (left >= right) {
return;
}
int pivot = arr[left];
int i = left + 1, j = right;
while (i <= j) {
if (arr[i] > pivot && arr[j] < pivot) {
// 交换 arr[i] 和 arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
} else if (arr[i] <= pivot) {
i++;
} else if (arr[j] >= pivot) {
j--;
}
}
// 交换 arr[left] 和 arr[j]
arr[left] = arr[j];
arr[j] = pivot;
quickSort(arr, left, j - 1);
quickSort(arr, j + 1, right);
}
void mergeSets(int* setA, int sizeA, int* setB, int sizeB) {
// 对 A 和 B 集合执行快速排序
quickSort(setA, 0, sizeA - 1);
quickSort(setB, 0, sizeB - 1);
int merged[sizeA + sizeB];
int i = 0, j = 0, k = 0;
while (i < sizeA && j < sizeB) {
if (setA[i] < setB[j]) {
merged[k++] = setA[i++];
} else if (setA[i] > setB[j]) {
merged[k++] = setB[j++];
} else {
merged[k++] = setA[i++];
j++;
}
}
while (i < sizeA) {
merged[k++] = setA[i++];
}
while (j < sizeB) {
merged[k++] = setB[j++];
}
for (int idx = 0; idx < k; idx++) {
printf("%d ", merged[idx]);
}
printf("\n");
}
int main() {
int n, m;
while (scanf("%d %d", &n, &m) == 2) {
int setA[n];
int setB[m];
for (int i = 0; i < n; i++) {
scanf("%d", &setA[i]);
}
for (int i = 0; i < m; i++) {
scanf("%d", &setB[i]);
}
mergeSets(setA, n, setB, m);
}
return 0;
}