#include <bits/stdc++.h>
using namespace std;
namespace Dango {
const int MAXN = 200005;
vector<int> s, t;
int n, c[MAXN], p[MAXN], pos, root;
int head[MAXN], to[MAXN << 1], nxt[MAXN << 1];
int fa[MAXN], d[MAXN], mn;
int anc, tag[MAXN];
int start[2];
int st[MAXN], top;
long long res, ans;
bool vis[MAXN];
int read() {
  int x = 0, f = 0;
  char ch = getchar();
  while (!isdigit(ch)) {
    f |= (ch == '-');
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return f ? -x : x;
}
void add(int u, int v) {
  static int cnt;
  cnt++;
  to[cnt] = v;
  nxt[cnt] = head[u];
  head[u] = cnt;
}
void dfs(int u, int f) {
  fa[u] = f;
  d[u] = d[f] + 1;
  for (int i = head[u]; i; i = nxt[i]) {
    int v = to[i];
    if (v == f) continue;
    dfs(v, u);
  }
}
int judge() {
  int now = 0;
  for (; now < t.size(); now++)
    if (t[now] == s[0]) break;
  for (int i = 0, j = now; i < s.size(); i++, j++)
    if (s[i] != t[j]) return -1;
  return now;
}
int work() {
  n = read();
  for (int i = 1; i <= n; i++) {
    c[i] = read();
    if (!c[i]) pos = i;
  }
  for (int i = 1; i <= n; i++) {
    p[i] = read();
    if (!p[i]) root = i;
  }
  for (int i = 1; i < n; i++) {
    int u = read(), v = read();
    add(u, v);
    add(v, u);
  }
  dfs(root, 0);
  for (int i = pos; i != root; i = fa[i]) swap(c[i], c[fa[i]]);
  int flag = 0;
  mn = n;
  for (int i = 1; i <= n; i++)
    if (c[i] != p[i]) {
      flag = 1;
      vis[i] = true;
      if (d[i] < mn) {
        mn = d[i];
        anc = fa[i];
      }
    }
  if (!flag) {
    printf("0 %d", d[pos] - 1);
    return 0;
  }
  for (int i = 1; i <= n; i++) {
    if (!vis[i] || d[i] > mn) continue;
    if (fa[i] != anc) {
      printf("-1");
      return 0;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (!vis[i]) continue;
    int j = i;
    for (; j != anc && !tag[fa[j]]; j = fa[j]) tag[fa[j]]++;
  }
  if (tag[anc] > 2) {
    printf("-1");
    return 0;
  }
  for (int i = 1; i <= n; i++)
    if (vis[i] && tag[i] > 1) {
      printf("-1");
      return 0;
    }
  int cnt = 0;
  for (int i = 1; i <= n; i++)
    if (vis[i] && !tag[i]) start[cnt++] = i;
  for (int i = start[0]; i != anc; i = fa[i]) {
    s.push_back(c[i]);
    t.push_back(p[i]);
  }
  if (cnt > 1)
    for (int i = start[1]; i != anc; i = fa[i]) st[++top] = i;
  else
    start[1] = anc;
  for (int i = st[top]; top; i = st[--top]) {
    s.push_back(c[i]);
    t.push_back(p[i]);
  }
  int tmp = t.size();
  for (int i = 0; i < tmp; i++) t.push_back(t[i]);
  long long step = 0;
  if ((step = judge()) == -1) {
    printf("-1");
    return 0;
  }
  res = step * (s.size() + 1);
  res += (d[anc] - 1) * 2 + d[pos] - 1;
  for (int i = anc; i != root; i = fa[i]) vis[i] = true;
  for (int i = start[1]; i != anc; i = fa[i]) vis[i] = false;
  for (int i = pos; i; i = fa[i])
    if (vis[i]) res -= 2;
  ans = res;
  step = s.size() - step;
  res = step * (s.size() + 1);
  res += (d[anc] - 1) * 2 + d[pos] - 1;
  for (int i = start[1]; i != anc; i = fa[i]) vis[i] = true;
  for (int i = start[0]; i != anc; i = fa[i]) vis[i] = false;
  for (int i = pos; i; i = fa[i])
    if (vis[i]) res -= 2;
  ans = min(res, ans);
  if (start[0] > start[1]) swap(start[0], start[1]);
  printf("%d %d %lld", start[0], start[1], ans);
  return 0;
}
}  // namespace Dango
int main() { return Dango::work(); }
