#include <bits/stdc++.h>
template <typename T>
void MACRO_VAR_Scan(T& t) {
  std::cin >> t;
}
template <typename First, typename... Rest>
void MACRO_VAR_Scan(First& first, Rest&... rest) {
  std::cin >> first;
  MACRO_VAR_Scan(rest...);
}
template <typename T>
void MACRO_VEC_ROW_Init(int n, T& t) {
  t.resize(n);
}
template <typename First, typename... Rest>
void MACRO_VEC_ROW_Init(int n, First& first, Rest&... rest) {
  first.resize(n);
  MACRO_VEC_ROW_Init(n, rest...);
}
template <typename T>
void MACRO_VEC_ROW_Scan(int p, T& t) {
  std::cin >> t[p];
}
template <typename First, typename... Rest>
void MACRO_VEC_ROW_Scan(int p, First& first, Rest&... rest) {
  std::cin >> first[p];
  MACRO_VEC_ROW_Scan(p, rest...);
}
template <typename T>
inline T CHMAX(T& a, const T b) {
  return a = (a < b) ? b : a;
}
template <typename T>
inline T CHMIN(T& a, const T b) {
  return a = (a > b) ? b : a;
}
using ll = long long;
using ull = unsigned long long;
constexpr ll INFINT = 1 << 30;
constexpr ll INFINT_LIM = (1LL << 31) - 1;
constexpr ll INFLL = 1LL << 60;
constexpr ll INFLL_LIM = (1LL << 62) - 1 + (1LL << 62);
constexpr double EPS = 1e-7;
constexpr ll MOD = 1000000007;
constexpr double PI = 3.141592653589793238462643383279;
class UnionFind {
 private:
  std::vector<ll> parent;
  std::vector<ll> height;
  std::vector<ll> m_size;

 public:
  UnionFind(ll size_) : parent(size_), height(size_, 0), m_size(size_, 1) {
    for (ll i = 0; i < ll(size_); ++i) {
      parent[i] = i;
    }
  }
  void init(ll size_) {
    parent.resize(size_);
    height.resize(size_, 0);
    m_size.resize(size_, 0);
    for (ll i = 0; i < ll(size_); ++i) {
      parent[i] = i;
    }
  }
  ll find(ll x) {
    if (parent[x] == x) {
      return x;
    }
    return parent[x] = find(parent[x]);
  }
  void unite(ll x, ll y) {
    x = find(x);
    y = find(y);
    if (x == y) return;
    ll t = size(x) + size(y);
    m_size[x] = m_size[y] = t;
    if (height[x] < height[y])
      parent[x] = y;
    else
      parent[y] = x;
    if (height[x] == height[y]) ++height[x];
  }
  bool same(ll x, ll y) { return find(x) == find(y); }
  ll size(ll x) {
    if (parent[x] == x) {
      return m_size[x];
    }
    return size(parent[x] = find(parent[x]));
  }
};
signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  ;
  ll n;
  MACRO_VAR_Scan(n);
  ;
  std::vector<ll> a(n);
  for (auto& i : a) std::cin >> i;
  ;
  std::vector<ll> b(n);
  for (auto& i : b) std::cin >> i;
  ;
  ll x = 0;
  for (ll i = 0; i < ll(n); ++i) x ^= a[i];
  ll y = 0;
  for (ll i = 0; i < ll(n); ++i) y ^= b[i];
  if (a == b) {
    std::cout << 0;
    std::cout << "\n";
    ;
    return 0;
  }
  {
    std::map<ll, ll> map;
    for (ll i = 0; i < ll(n); ++i) ++map[a[i]];
    ++map[x];
    for (ll i = 0; i < ll(n); ++i) {
      --map[b[i]];
      if (map[b[i]] < 0) {
        std::cout << -1;
        std::cout << "\n";
        ;
        return 0;
      }
    }
  }
  std::map<ll, ll> map;
  ll p = 0;
  for (ll i = 0; i < ll(n); ++i) {
    if (map.find(a[i]) == map.end()) {
      map[a[i]] = p++;
    }
  }
  if (map.find(x) == map.end()) {
    map[x] = p++;
  }
  ll cnt = 0;
  UnionFind uf(p);
  for (ll i = 0; i < ll(n); ++i) {
    if (a[i] == b[i]) continue;
    ++cnt;
    uf.unite(a[i], b[i]);
  }
  uf.unite(x, y);
  std::set<ll> set;
  for (ll i = 0; i < ll(p); ++i) {
    if (uf.size(i) == 1) continue;
    set.insert(uf.find(i));
  }
  if (uf.size(x) != 1) --cnt;
  std::cout << cnt + set.size();
  std::cout << "\n";
  ;
  return 0;
}
