#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <functional> //functionalban van a bitwise xor
#define maxN 100001
using namespace std;
int a[maxN];
int b[maxN];
//Note: c++-ban `a` xor `b` = a^b;
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
for (int i = 0; i < m; i++)
{
cin >> b[i];
}
bool gyors_e = true;//+14 pont, ha n=m es A_i=B_i reszfeladat
if (n != m) { gyors_e = false; }//Ha n!=m nem el a reszfeladat
else{
for (int i = 0; i < n&&gyors_e; i++)
{
if (a[i] != b[i])gyors_e = false;//Ha nem egyenloek, akkor nem szimmetrikus, nem el a reszfeladat
}
}
if (gyors_e) {
//Ilyenkor a ket sorozat ugyan az
//A tablazat az x tengelyen szimmetrikus
//ha egy ertekbe bele xoroljuk az egyik szamot ketszer, akkor olyan, mintha nem xoroltuk volna bele
//ezert eleg csak az atlot osszexorolni
int base = 0;
for (int i = 0; i < n; i++)
{
//Az atlon x+x=2*x
base ^= (a[i] * 2);
}
cout << base;
return 0;
}
int temp = 0;
//Roll unwrapping? Valszeg nem segit, az n^2-et kene kioptimalizalni
vector<int> col(m);
int temp_a;
for (int i = 0; i < n; i++)
{
temp_a = a[i];
for (int j = 0; j < m; j++)
{
col[j] = temp_a + b[j];//kiszamolom egy oszlopban az osszes osszeget
}
//Aztan osszexorolom az egesz oszlopot, a temp kezdoertekkel
//accumulate altalaban osszeadasra jo, de meg lehet adni furan sajat moveletet is
//az xor sorrendje felcserelheto, szoval mukodik, bar nem tudom hogyan mukodik az accumulate belul
//De mindent amit az osszeadas tud, tud az xor is, szoval csak menni fog
temp = accumulate(col.begin(), col.end(), temp, bit_xor<void>());
}
cout << temp;
}