// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

#define erorp(x) cout<<#x<<"={"<<(x.F)<<" , "<<x.S<<"}"<<endl;

#define print(v,r) f(i,0,r) cout<<v[i]<<" "; cout<<endl;

#define is_bit(x,y) (x%(1<<(y+1))>=(1<<y))

#define eror(x) cout<<#x<<'='<<(x)<<endl;

#define f_(i,a,b) for(int i=a;i>=b;i--)

#define Gett(x,y) scanf("%d%d",&x,&y);

#define f(i,a,b) for(int i=a;i<b;i++)

#define get(x) scanf("%I64d",&x);

#define All(x) x.begin(),x.end()

#define gett(x) scanf("%d",&x);

#define Add(x,y) x=(x+y)%mod

#define maxm(a,b) a=max(a,b)

#define minm(a,b) a=min(a,b)

#define lst(x) x[x.size()-1]

#define sz(x) int(x.size())

#define mp make_pair

#define ll long long

#define pb push_back

#define S second

#define F first



const int N=1e5+99;



int n,c,x,mv,ans,res,a[N],b[N],mark[N];

map<int,int> t,tn;

vector<int> g[N];



void dfs(int x){

    mark[x]=1;

    f(i,0,g[x].size())

        if(!mark[g[x][i]])

            dfs(g[x][i]);

    ans+=g[x].size();

}



int main(){

    cin>>n;

    f(i,1,n+1){

        gett(a[i]);

        a[0]^=a[i];

        t[a[i]]++;

    }

    t[a[0]]++;

    f(i,1,n+1){  

        gett(b[i]);

        b[0]^=b[i];

    }

    f(i,0,n+1){

        t[b[i]]--;

        if(t[b[i]]<0)

            return cout<<-1,0;

    }

    f(i,0,n+1){

        if(!tn[a[i]]){

            c++;

            tn[a[i]]=c;

        }

    }

    f(i,0,n+1){

        a[i]=tn[a[i]];

        b[i]=tn[b[i]];

        if(a[i]!=b[i]) g[a[i]].pb(b[i]);

    }

    f(i,1,n+1)

        if(b[i]==a[0] && b[0]==a[0])

            mv=1;

    f(i,1,n+2)

        if(!mark[i] && sz(g[i])){

            res++;

            dfs(i);

        }

    if(ans==0) return cout<<0,0;

    cout<<ans+res-(a[0]!=b[0])*2-mv;

}

            

// Faster C++ solution for the same problem (measured speedup: 3.4676588305901066x):
#include<bits/stdc++.h>

using namespace std;



const int N = 1000 * 100 + 10;

int a[N], b[N], n, par[N * 2], sz[N * 2];



int get_par(int root) {

	return par[root] == root? root: par[root] = get_par(par[root]);

}



void Union(int v, int u) {

	v = get_par(v), u = get_par(u);

	if (v == u)

		return;

	if (sz[u] > sz[v])

		swap(v, u);

	sz[v] += sz[u];

	par[u] = v;

}



int main() { 

	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

	int ans = 0;

	cin >> n;

	for (int i = 0; i < n; i++)

		cin >> a[i], a[n] ^= a[i];

	for (int i = 0; i < n; i++)

		cin >> b[i], b[n] ^= b[i];

	map<int, int> cnt;

	for (int i = 0; i <= n; i++)

		cnt[a[i]]++;

	for (int i = 0; i < n; i++) {

		cnt[b[i]]--;

		if (cnt[b[i]] < 0)

			return cout << "-1\n", 0;

	}

	vector<int> vec;

	for (int i = 0; i < n; i++)

		if (a[i] != b[i])

			vec.push_back(a[i]), vec.push_back(b[i]), ans++;

	vec.push_back(a[n]), vec.push_back(b[n]);

	sort(vec.begin(), vec.end());

	vec.resize(unique(vec.begin(), vec.end()) - vec.begin());

	int s = (int)(vec.size());

	for (int i = 0; i < s; i++)

		par[i] = i, sz[i] = 1;

	for (int i = 0; i <= n; i++) 

		if (a[i] != b[i]) {

			a[i] = lower_bound(vec.begin(), vec.end(), a[i]) - vec.begin();

			b[i] = lower_bound(vec.begin(), vec.end(), b[i]) - vec.begin();

			Union(a[i], b[i]);

		}

	for (int i = 0; i < s; i++)

		if (get_par(i) == i)

			ans++;

	cout << ans - 1 << '\n';

	return 0;

}