#include <bits/stdc++.h>
using namespace std;
void gg() {
  printf("-1\n");
  exit(0);
  return;
}
int n;
struct Edge {
  int v, nxt;
} e[400010];
int tot;
int first[200010];
void build(int u, int v) {
  e[++tot] = (Edge){v, first[u]};
  first[u] = tot;
  return;
}
int a[200010], b[200010];
int fa[200010];
int dis[200010];
int pos[200010];
void dfs1(int u, int lst) {
  fa[u] = lst;
  if (lst) dis[u] = dis[lst] + 1;
  for (int i = first[u]; i; i = e[i].nxt)
    if (e[i].v != lst) dfs1(e[i].v, u);
  return;
}
bool vis[200010];
void work1() {
  int x = pos[1];
  int res = dis[x];
  while (x != 1) {
    vis[x] = true;
    swap(b[x], b[fa[x]]);
    x = fa[x];
  }
  vis[1] = true;
  for (int i = 1; i <= n; i++)
    if (b[i] != i) return;
  printf("0 %d\n", res);
  exit(0);
}
vector<int> vec[2];
int num = 0;
void getpath(int u) {
  if (num == 2 || (num == 1 && fa[u] != fa[vec[0][0]])) gg();
  while (u) {
    vec[num].push_back(u);
    int v = 0;
    for (int i = first[u]; i; i = e[i].nxt)
      if (e[i].v != fa[u] && b[e[i].v] != e[i].v) {
        if (!v)
          v = e[i].v;
        else
          gg();
      }
    u = v;
  }
  num++;
}
void dfs2(int u) {
  for (int i = first[u]; i; i = e[i].nxt)
    if (e[i].v != fa[u]) {
      if (b[e[i].v] == e[i].v)
        dfs2(e[i].v);
      else
        getpath(e[i].v);
    }
  return;
}
int tmp[200010];
int ori[200010];
void work2() {
  int u, v, x;
  if (num == 1) {
    x = u = fa[vec[0][0]];
    v = vec[0][vec[0].size() - 1];
  } else {
    x = fa[vec[0][0]];
    u = vec[0][vec[0].size() - 1];
    v = vec[1][vec[1].size() - 1];
    for (int i = 1; i <= vec[1].size(); i++)
      vec[0].push_back(vec[1][vec[1].size() - i]);
  }
  memset(tmp, -1, sizeof(tmp));
  int k = 0, num = vec[0].size();
  for (int i = 0; i < num; i++) {
    int o = vec[0][i];
    tmp[o] = i;
  }
  for (int i = 1; i <= n; i++)
    if (tmp[i] == -1 && b[i] != i) gg();
  for (int i = 0; i < num; i++) {
    int o = vec[0][i];
    int val = (tmp[b[o]] + num - i) % num;
    if (i == 0)
      k = val;
    else if (k != val)
      gg();
  }
  int dist = dis[u] + dis[v] - dis[x] * 2 + 1;
  long long ans;
  if (!vis[x]) {
    k = min(k, num - k);
    ans = (long long)k * dist;
    while (!vis[x]) ans += 2, x = fa[x];
    ans += dis[pos[1]];
  } else {
    int cnt = 0;
    for (int i = 0; i < num; i++) {
      int o = vec[0][i];
      cnt += vis[o];
    }
    if (vis[vec[0][0]])
      ans = min((long long)dist * k, (long long)dist * (num - k) - 2 * cnt) +
            dis[pos[1]];
    else
      ans = min((long long)dist * k - 2 * cnt, (long long)dist * (num - k)) +
            dis[pos[1]];
  }
  u = ori[u];
  v = ori[v];
  if (u > v) swap(u, v);
  printf("%d %d %I64d\n", u, v, ans);
  return;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    a[i]++;
    ori[a[i]] = i;
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d", &b[a[i]]);
    b[a[i]]++;
    pos[b[a[i]]] = a[i];
  }
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    u = a[u];
    v = a[v];
    build(u, v);
    build(v, u);
  }
  dfs1(1, 0);
  work1();
  dfs2(1);
  work2();
  return 0;
}
