#include <bits/stdc++.h>
using namespace std;
int read();
int n;
int a[200005], b[200005], c[200005], bk[200005];
int hd[200005], nx[400005], to[400005], cnt;
void add(int f, int t) { nx[++cnt] = hd[f], hd[f] = cnt, to[cnt] = t; }
int fa[200005], dep[200005];
void dfs1(int u) {
  for (int i = hd[u], v; i; i = nx[i])
    if ((v = to[i]) != fa[u]) dep[v] = dep[fa[v] = u] + 1, dfs1(v);
}
bool check1() {
  for (int i = 1; i <= n; ++i) c[i] = b[i];
  int u = a[1];
  while (fa[u]) swap(c[u], c[fa[u]]), u = fa[u];
  for (int i = 1; i <= n; ++i)
    if (c[i] != i) return 0;
  return 1;
}
vector<int> st[2];
int idcnt;
void fail() { puts("-1"), exit(0); }
void get(int u, int id) {
  if (id >= 2 || (id == 1 && fa[st[0][0]] != fa[u])) fail();
  st[id].push_back(u);
  while (1) {
    int v = 0;
    for (int i = hd[u]; i; i = nx[i])
      if (to[i] != fa[u] && c[to[i]] != to[i]) v ? fail() : (v = to[i], void());
    if (!v) break;
    st[id].push_back(u = v);
  }
}
void dfs2(int u) {
  for (int i = hd[u], v; i; i = nx[i])
    if ((v = to[i]) != fa[u]) (c[v] != v) ? get(v, idcnt++) : dfs2(v);
}
int p[200005], q[200005], len;
int M(int x) { return x >= len ? x - len : x; }
int getdis(int u, int v) {
  int rt = 0;
  while (u != v) (dep[u] < dep[v]) ? swap(u, v) : void(), ++rt, u = fa[u];
  return rt;
}
void work() {
  for (int i = 1; i <= n; ++i) q[i] = -1;
  for (int i = 0; i < st[0].size(); ++i)
    p[len] = c[st[0][i]], q[st[0][i]] = len, ++len;
  int ru = st[0].back(), rv = fa[st[0].front()], rw = rv;
  if (st[1].size()) {
    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);
  long long dis = q[p[0]];
  for (int i = 1; i < len; ++i)
    if (M(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);
    printf("%d %d %lld\n", ru, rv, dis + getdis(a[1], rw) + dep[rw]);
    return;
  }
  dis = q[t] >= st[0].size()
            ? min((dis - 1) * (len + 1) + (q[t] + 1),
                  1ll * M(len - dis) * (len + 1) + (len - q[t]))
            : min(dis * (len + 1) + (q[t] + 1),
                  (len - dis - 1) * (len + 1) + (len - q[t]));
  printf("%d %d %lld\n", ru, rv, dis + dep[rw] + getdis(a[1], t));
}
int main() {
  n = read();
  for (int i = 1; i <= n; ++i) bk[a[i] = read() + 1] = i;
  for (int i = 1; i <= n; ++i) b[a[i]] = read() + 1;
  for (int i = 1, u, v; i < n; ++i)
    u = a[read()], v = a[read()], add(u, v), add(v, u);
  for (int i = 1; i <= n; ++i) a[b[i]] = i;
  dfs1(1);
  if (check1()) return printf("0 %d\n", dep[a[1]]), 0;
  dfs2(1), work();
  return 0;
}
const int _SIZE = 1 << 22;
char ibuf[_SIZE], *iS = ibuf, *iT = ibuf;
int read() {
  int x = 0, f = 1;
  char c = (iS == iT ? iT = ((iS = ibuf) + fread(ibuf, 1, _SIZE, stdin)),
            (iS == iT ? EOF : *iS++) : *iS++);
  while (!isdigit(c))
    f = (c == '-') ? -1 : f,
    c = (iS == iT ? iT = ((iS = ibuf) + fread(ibuf, 1, _SIZE, stdin)),
         (iS == iT ? EOF : *iS++) : *iS++);
  while (isdigit(c))
    x = x * 10 + c - '0',
    c = (iS == iT ? iT = ((iS = ibuf) + fread(ibuf, 1, _SIZE, stdin)),
         (iS == iT ? EOF : *iS++) : *iS++);
  return x * f;
}
