#include<iostream>
#include<cstdlib>
#include<stdio.h>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
set<long long>xp[60];
set<long long>::iterator it;
int n,cnt_list,m;
long long a[1<<18],b[1<<18],list[1<<18],ax,hs[2][1<<18];
long long ans;
bool dvd[1<<18];
int up;
bool dfs(int id)
{
	if(id<0)
	    return true;
	int i,j,s,p,q,pre;
    bool can[2];
   	int num[2][2];
   	memset(can,true,sizeof(can));
    pre=0;
	for(j=0;j<n;j++)
   	{
   	   if(dvd[j]||j==n-1)
   	   {
   	   	    memset(num,0,sizeof(num));
  	   	    for(s=pre;s<=j;s++)
  	   	    {
    	   	    if(a[s]&(1LL<<id))
				   num[0][1]++;
				else
				   num[0][0]++;
				if(b[s]&(1LL<<id))
				   num[1][1]++;
				else
				   num[1][0]++;	
	   	    }
	   	    if(num[0][0]!=num[1][0])
	   	        can[0]=false;
	        if(num[0][0]!=num[1][1])
	            can[1]=false;
            if(!can[0]&&!can[1])
                return false;
  	   	    pre=j+1;
   	   }
    }
	for(i=0;i<=1;i++)
    {
    	if(!can[i])
    	   continue;
    	pre=0;
    	vector<int>vec;
	    vec.clear();
    	for(j=0;j<n;j++)
    	{
	    	if(dvd[j]||j==n-1)
	    	{
			    cnt_list=0;
			    for(s=pre;s<=j;s++)
			    {
    				if(!(a[s]&(1LL<<id)))
    				   list[cnt_list++]=a[s]; 
    			}
    			for(s=pre;s<=j;s++)
    			{
			    	if(a[s]&(1LL<<id))
			    	    list[cnt_list++]=a[s];
			    }
			    for(s=0;s<cnt_list;s++)
			       a[s+pre]=list[s];
    			cnt_list=0;
    			if(i==0)
    			{
    				for(s=pre;s<=j;s++)
    				{
				    	if(!(b[s]&(1LL<<id)))
				    	  list[cnt_list++]=b[s];
				    }
				    for(s=pre;s<=j;s++)
				    {
    					if(b[s]&(1LL<<id))
    					   list[cnt_list++]=b[s];
    				}
			    }
			    else
			    {
    				for(s=pre;s<=j;s++)
    				{
				    	if(b[s]&(1LL<<id))
				    	   list[cnt_list++]=b[s];
				    }
				    for(s=pre;s<=j;s++)
				    {
    					if(!(b[s]&(1LL<<id)))
    				       list[cnt_list++]=b[s];
    				}
    			}
    			for(s=0;s<cnt_list;s++)
    			    b[s+pre]=list[s];
    			for(s=pre;s<=j;s++)
    			{
			    	if(a[s]&(1LL<<id))
		    	    {
		    	    	if(s>pre)
		    	    	{
    	    		    	dvd[s-1]=true;
		    	    	    vec.push_back(s-1);
						}
						break;
    	    		}
			    }
	    		pre=j+1;
	    	}
	    }
	    if(i==1)
	       ans|=(1LL<<id);
        it=xp[id].find(ans);
        if(it!=xp[id].end())
        {
            if(dfs(id-1))
               return true;
        }
		if(i==1)
           ans^=(1LL<<id);
        for(j=0;j<vec.size();j++)
            dvd[vec[j]]=false;
    }
    return false;
}
int main()
{
	int i,j,s,p,q,id;
	freopen("simple.in","r",stdin);
	freopen("simple.out","w",stdout);
	scanf("%d",&n);
	for(i=0;i<n;i++)
	    scanf("%I64d",&a[i]);
    for(i=0;i<n;i++)
        scanf("%I64d",&b[i]);
 //   n=1<<18;
   // for(i=0;i<n;i++)
    //{
    //	a[i]=0;
   //  	for(j=0;j<60;j++)
    //	   a[i]=(a[i]<<1LL)+rand()%2;
  //  }
   // long long c=0;
   // for(j=0;j<60;j++)
   // c=(c<<1LL)+rand()%2;
   // for(i=0;i<n;i++)
    //   b[i]=a[i]^c;
	ax=0;
    for(i=0;i<n;i++)
    {
        ax=max(ax,a[i]);
        ax=max(ax,b[i]);
	}
	random_shuffle(a,a+n);
	for(up=0;(1LL<<up)<=ax;up++);
    for(i=0;i<min(n,9);i++)
    {
    	for(j=0;j<n;j++)
    	{
    		if(i==0)
	        	hs[0][j]=a[i]^b[j];
    	    else
    	        hs[1][j]=a[i]^b[j];
		}
		if(i==0)
		{
		   sort(hs[0],hs[0]+n);
		   m=n;
		}
		else
        {
        	sort(hs[1],hs[1]+n);
        	cnt_list=0;
        	p=0;
        	q=0;
        	while(p<m&&q<n)
        	{
	        	if(hs[0][p]<hs[1][q])
	        	   p++;
   	            else if(hs[0][p]>hs[1][q])
   	               q++;
                else
                {
                	list[cnt_list++]=hs[0][p];
                	p++;
                	q++;
                }
	        }
	        for(p=0;p<cnt_list;p++)
	            hs[0][p]=list[p];
            m=cnt_list;
        }
    }
    for(i=0;i<up;i++)
        xp[i].clear();
    cnt_list=0;
    for(i=0;i<m;i++)
    {
    	if(cnt_list==0||hs[0][cnt_list-1]<hs[0][i])
    	    hs[0][cnt_list++]=hs[0][i];
    }
    m=cnt_list;
    for(i=0;i<m;i++)
    {
    	long long now=0;
    	for(j=up-1;j>=0;j--)
    	{
	    	now|=(hs[0][i]&(1LL<<j));
	    	xp[j].insert(now);
	    }
    }
	memset(dvd,false,sizeof(dvd));
    ans=0;
    if(!dfs(up-1))
       puts("-1");
	else
       printf("%I64d\n",ans);
	return 0;
}