#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 7;
const long long INF = 1e9 + 7;
long long a[N], b[N], c[N], fc[N], pos[N], fa[N], dep[N], sz[N], dg[N], id[N],
    p[N], bp[N], cp[N];
bool g[N];
long long n, r1, r2, num = 0;
struct edge {
  long long v, next;
} e[N * 2];
void add(long long x, long long y) {
  e[num] = (edge){y, pos[x]};
  pos[x] = num++;
}
void dfs(long long x, long long f, long long d) {
  dep[x] = d;
  fa[x] = f;
  if (x == r2)
    sz[x] = 1;
  else
    sz[x] = 0;
  for (long long i = pos[x]; ~i; i = e[i].next) {
    if (e[i].v == f) continue;
    dfs(e[i].v, x, d + 1);
    sz[x] += sz[e[i].v];
  }
}
void dfs2(long long x, long long d, long long f) {
  id[x] = d;
  p[d] = x;
  for (long long i = pos[x]; ~i; i = e[i].next) {
    if (!g[e[i].v] || e[i].v == f) continue;
    dfs2(e[i].v, d + 1, x);
  }
}
long long fd(long long x, long long &xx, long long f) {
  if (g[x]) {
    xx = id[x];
    return 0;
  }
  for (long long i = pos[x]; ~i; i = e[i].next) {
    if (e[i].v == f) continue;
    long long t = fd(e[i].v, xx, x);
    if (~t) return t + 1;
  }
  return -1;
}
int main() {
  scanf("%lld", &n);
  for (long long i = 1; i <= n; i++) scanf("%lld", &a[i]);
  for (long long i = 1; i <= n; i++) scanf("%lld", &b[i]);
  for (long long i = 1; i <= n; i++) {
    if (!a[i]) r1 = i;
    if (!b[i]) r2 = i;
  }
  memset(pos, -1, sizeof(pos));
  for (long long i = 1; i <= n - 1; i++) {
    long long x, y;
    scanf("%lld%lld", &x, &y);
    add(x, y);
    add(y, x);
  }
  dfs(r1, 0, 1);
  for (long long i = 1; i <= n; i++) {
    if (sz[i] && i != r1) c[fa[i]] = a[i];
    if (i == r2) c[i] = 0;
    if (!sz[i]) c[i] = a[i];
  }
  bool fl = 0;
  for (long long i = 1; i <= n; i++) {
    if (c[i] != b[i]) {
      fl = 1;
      break;
    }
  }
  if (!fl) {
    printf("0 %lld\n", dep[r2] - 1);
    return 0;
  }
  for (long long i = 1; i <= n; i++) fc[c[i]] = i;
  long long mn = INF, md;
  for (long long i = 1; i <= n; i++) {
    if (b[fc[a[i]]] != a[i]) {
      g[i] = 1;
      if (dep[i] < mn) {
        mn = dep[i];
        md = i;
      }
    }
  }
  g[fa[md]] = 1;
  for (long long i = 1; i <= n; i++) {
    dg[i] = 0;
    for (long long j = pos[i]; ~j; j = e[j].next) dg[i] += g[e[j].v];
  }
  long long t1 = 0, t2 = 0, sg = 0;
  for (long long i = 1; i <= n; i++) {
    if (!g[i]) continue;
    sg++;
    if (dg[i] < 1 || dg[i] > 2) {
      puts("-1");
      return 0;
    }
    if (dg[i] == 1) {
      if (!t1)
        t1 = i;
      else if (!t2)
        t2 = i;
      else {
        puts("-1");
        return 0;
      }
    }
  }
  dfs2(t1, 1, 0);
  long long v1, v2, np = 0;
  long long ans = fd(r1, v1, 0) + fd(r2, v2, 0);
  for (long long i = 1; i <= sg; i++)
    if (i != v2) p[++np] = p[i];
  for (long long i = 1; i <= sg - 1; i++) bp[i] = b[p[i]], cp[i] = c[p[i]];
  long long rw = -1;
  for (long long i = 0; i <= sg - 1 - 1; i++)
    if (bp[1] == cp[i + 1]) rw = i;
  if (rw < 0) {
    puts("-1");
    return 0;
  }
  for (long long i = 1; i <= sg - 1; i++)
    if (bp[i] != cp[(i - 1 + rw) % (sg - 1) + 1]) {
      puts("-1");
      return 0;
    }
  long long tt;
  if (v1 == v2)
    tt = sg * min(rw, (sg - 1) - rw);
  else if (v1 < v2)
    tt = min(sg * rw + (v2 - v1), sg * (sg - 1 - rw) - (v2 - v1));
  else
    tt = min(sg * rw - (v1 - v2), sg * (sg - 1 - rw) + (v1 - v2));
  printf("%lld %lld %lld\n", min(t1, t2), max(t1, t2), tt + ans);
  return 0;
}
