#include <iostream>
using namespace std;
const int mxN = 1e5;
void Afisare(int v[])
{
for(int i = 1;i<=v[0];i++)
cout << v[i] << ' ' ;
cout << '\n';
}
int* Reuniune(int A[], int B[])
{
int* C = new int[2 * mxN + 10];
int it = 0, i = 1, j = 1;
while(i <= A[0] && j <= B[0])
{
if(A[i] == B[j]) C[++it] = A[i++], j++;
else if(A[i] < B[j]) C[++it] = A[i++];
else if(A[i] > B[j]) C[++it] = B[j++];
}
while(i <= A[0]) C[++it] = A[i++];
while(j <= B[0]) C[++it] = B[j++];
C[0] = it;
return C;
}
int* Intersectie(int A[], int B[])
{
int* C = new int[2 * mxN + 10];
int it = 0, i = 1, j = 1;
while(i <= A[0] && j <= B[0])
{
if(A[i] == B[j])
C[++it] = A[i++],j++;
else if(A[i] < B[j])
i++;
else j++;
}
C[0] = it;
return C;
}
int* Diferenta(int A[], int B[])
{
int* C = new int[2 * mxN + 10];
int it = 0, i = 1, j = 1;
while(i <= A[0] && j <= B[0])
{
if(A[i] == B[j])
i++,j++;
else if(A[i] < B[j])
C[++it] = A[i++];
else if(A[i] > B[j])
j++;
}
while(i <= A[0])
C[++it] = A[i++];
C[0] = it;
return C;
}
int main()
{
int A[mxN+10] = {0} , B[mxN+10] = {0};
cin >> A[0] >> B[0];
for(int i = 1;i<=A[0];i++)
cin >> A[i];
for(int i = 1;i<=B[0];i++)
cin >> B[i];
Afisare(Reuniune(A,B));
Afisare(Intersectie(A,B));
Afisare(Diferenta(A,B));
Afisare(Diferenta(B,A));
return 0;
}
/*
INPUT :
4 4
1 2 3 4
3 4 5 6
OUTPUT :
1 2 3 4 5 6
3 4
1 2
5 6
*/