#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 200005;
int n;
int a[N], b[N], c[N];
vector<int> adj[N];
int st, ed;
int par[N], inCycle[N];
vector<int> leaf;
int inVer, outVer;
ll ans;
void dfs1(int u, int p) {
  for (int v : adj[u]) {
    if (v != p) {
      par[v] = u;
      dfs1(v, u);
    }
  }
}
void dfs2(int u, int p) {
  int cnt = 0;
  for (int v : adj[u]) {
    if (v != p) {
      par[v] = u;
      if (a[v] != b[v]) cnt++;
      dfs2(v, u);
    }
  }
  if (a[u] != b[u] && cnt == 0) leaf.push_back(u);
  if (a[u] != b[u] && cnt > 1) {
    for (int i = 1; i <= 3; i++) leaf.push_back(-1);
  }
}
void dfs3(int u, int p, int h) {
  if (inCycle[u] == 1) {
    inVer = u;
    ans += h;
    return;
  }
  for (int v : adj[u]) {
    if (v != p) {
      par[v] = u;
      dfs3(v, u, h + 1);
    }
  }
}
void dfs4(int u, int p, int h) {
  if (inCycle[u] == 1) {
    outVer = u;
    ans += h;
    return;
  }
  for (int v : adj[u]) {
    if (v != p) {
      dfs4(v, u, h + 1);
    }
  }
}
ll solve(vector<int> ver) {
  int sz = (int)ver.size();
  int now, color;
  for (int i = 0; i < sz; i++) {
    int nex = (i == sz - 1 ? 0 : i + 1);
    if (ver[i] == outVer) {
      now = nex;
      color = a[ver[nex]];
      break;
    }
  }
  int tmp = 0;
  while (b[ver[now]] != color) {
    now = (now == sz - 1 ? 0 : now + 1);
    tmp++;
  }
  return 1LL * min(tmp, sz - 1 - tmp) * sz;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    if (a[i] == 0) st = i;
    c[i] = a[i];
  }
  for (int i = 1; i <= n; i++) {
    cin >> b[i];
    if (b[i] == 0) ed = i;
  }
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  dfs1(st, st);
  vector<int> path;
  int now = ed;
  while (1) {
    path.push_back(now);
    if (now == st) break;
    now = par[now];
  }
  for (int i = (int)path.size() - 1; i >= 1; i--) {
    swap(a[path[i]], a[path[i - 1]]);
  }
  int ok = 1;
  for (int i = 1; i <= n; i++) {
    if (a[i] != b[i]) {
      ok = 0;
      break;
    }
  }
  if (ok == 1) {
    cout << 0 << " " << (int)path.size() - 1;
    return 0;
  }
  dfs2(ed, ed);
  if ((int)leaf.size() > 2) {
    cout << -1;
    return 0;
  }
  vector<int> cycle;
  pair<int, int> edge;
  if ((int)leaf.size() == 1) {
    int u = leaf[0];
    while (1) {
      cycle.push_back(u);
      inCycle[u] = 1;
      if (a[u] == b[u]) break;
      u = par[u];
    }
    edge = {leaf[0], u};
  } else {
    int u = leaf[0];
    while (1) {
      cycle.push_back(u);
      inCycle[u] = 1;
      if (a[u] == b[u]) break;
      u = par[u];
    }
    reverse(cycle.begin(), cycle.end());
    u = leaf[1];
    while (a[u] != b[u]) {
      cycle.push_back(u);
      inCycle[u] = 1;
      u = par[u];
    }
    edge = {leaf[0], leaf[1]};
  }
  dfs4(ed, ed, 0);
  dfs3(st, st, 0);
  for (int i = 1; i <= n; i++) a[i] = c[i];
  now = inVer;
  path.clear();
  while (1) {
    path.push_back(now);
    if (now == st) break;
    now = par[now];
  }
  for (int i = (int)path.size() - 1; i >= 1; i--) {
    swap(a[path[i]], a[path[i - 1]]);
  }
  ll res = 1e18, sz = (int)cycle.size();
  vector<int> have, need;
  int ptr = 0;
  for (int i = 0; i < sz; i++) {
    int u = cycle[i];
    if (u != inVer) have.push_back(a[u]);
    if (u != outVer) need.push_back(b[u]);
  }
  ok = 1;
  for (int i = 0; i < sz - 1; i++)
    if (need[i] == have[0]) now = i;
  for (int i = 0; i < sz - 1; i++) {
    if (have[i] != need[now]) ok = 0;
    now = (now == sz - 2 ? 0 : now + 1);
  }
  if (ok == 0) {
    cout << -1;
    return 0;
  }
  if (inVer == outVer) {
    res = min(res, solve(cycle));
  } else {
    int ptr;
    for (int i = 0; i < sz; i++)
      if (cycle[i] == inVer) ptr = i;
    int tmp = 0;
    while (cycle[ptr] != outVer) {
      int nex = (ptr == sz - 1 ? 0 : ptr + 1);
      swap(a[cycle[ptr]], a[cycle[nex]]);
      ptr = nex;
      tmp++;
    }
    res = min(res, tmp + solve(cycle));
    while (cycle[ptr] != inVer) {
      int nex = (ptr == 0 ? sz - 1 : ptr - 1);
      swap(a[cycle[ptr]], a[cycle[nex]]);
      ptr = nex;
    }
    tmp = 0;
    while (cycle[ptr] != outVer) {
      int nex = (ptr == 0 ? sz - 1 : ptr - 1);
      swap(a[cycle[ptr]], a[cycle[nex]]);
      ptr = nex;
      tmp++;
    }
    res = min(res, tmp + solve(cycle));
  }
  ans += res;
  if (edge.first > edge.second) swap(edge.first, edge.second);
  cout << edge.first << " " << edge.second << " " << ans;
}
