#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
using ll = long long;
int n, a[N], b[N], c[N], bk[N];
vector<int> v[N];
int fa[N], dep[N];
void dfs1(int pos) {
  for (auto &i : v[pos])
    if (i != fa[pos]) dep[i] = dep[fa[i] = pos] + 1, dfs1(i);
}
bool check() {
  for (int i = 1; i <= n; i++) c[i] = b[i];
  int p = a[1];
  while (fa[p]) swap(c[p], c[fa[p]]), p = fa[p];
  for (int i = 1; i <= n; i++)
    if (c[i] != i) return 0;
  return 1;
}
vector<int> st[2];
int idx;
inline void fail() {
  cout << -1 << endl;
  exit(0);
}
void get(int pos, int id) {
  if (id > 1 || (id == 1 && fa[st[0][0]] != fa[pos])) fail();
  st[id].push_back(pos);
  while (1) {
    int vv = 0;
    for (auto &i : v[pos])
      if (c[i] != i && i != fa[pos]) {
        if (vv)
          fail();
        else
          vv = i;
      }
    if (!vv) break;
    st[id].push_back(pos = vv);
  }
}
int p[N], q[N], len;
inline int modlen(int x) { return x >= len ? x - len : x; }
void dfs2(int pos) {
  for (auto &i : v[pos])
    if (i != fa[pos]) {
      if (c[i] != i)
        get(i, idx++);
      else
        dfs2(i);
    }
}
int getdis(int x, int y) {
  int ret = 0;
  while (x != y) {
    if (dep[x] < dep[y]) swap(x, y);
    ++ret;
    x = fa[x];
  }
  return ret;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  int t1, t2;
  for (int i = 1; i <= n; i++) cin >> a[i], ++a[i], bk[a[i]] = i;
  for (int i = 1; i <= n; i++) cin >> b[a[i]], ++b[a[i]];
  for (int i = 1; i < n; i++)
    cin >> t1 >> t2, t1 = a[t1], t2 = a[t2], v[t1].push_back(t2),
                     v[t2].push_back(t1);
  for (int i = 1; i <= n; i++) a[b[i]] = i;
  dfs1(1);
  if (check()) {
    cout << "0 " << dep[a[1]] << endl;
    return 0;
  }
  dfs2(1);
  for (int i = 1; i <= n; i++) q[i] = -1;
  for (auto &i : st[0]) p[len] = c[i], q[i] = len++;
  int ru = st[0].back(), rv = fa[st[0].front()], rw = rv;
  if (!st[1].empty()) {
    rv = st[1].back();
    for (int i = st[1].size() - 1; i >= 0; --i)
      p[len] = c[st[1][i]], q[st[1][i]] = len, ++len;
  }
  if ((ru = bk[ru]) > (rv = bk[rv])) swap(ru, rv);
  ll dis = q[p[0]];
  for (int i = 1; i < len; i++)
    if (modlen(q[p[i]] - i + len) != dis) fail();
  for (int i = 1; i <= n; i++)
    if (c[i] != i && q[i] == -1) fail();
  int t = a[1];
  while (q[t] == -1 && t != 1) t = fa[t];
  if (t == 1) {
    dis = min(dis, len - dis) * (len + 1);
    cout << ru << ' ' << rv << ' ' << dis + getdis(a[1], rw) + dep[rw] << endl;
    return 0;
  }
  dis = q[t] >= int(st[0].size())
            ? min((dis - 1) * (len + 1) + (q[t] + 1),
                  modlen(len - dis) * ll(len + 1) + (len - q[t]))
            : min(dis * (len + 1) + (q[t] + 1),
                  (len - dis - 1) * (len + 1) + (len - q[t]));
  cout << ru << ' ' << rv << ' ' << dis + dep[rw] + getdis(a[1], t) << endl;
  return 0;
}
