#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + 5;
vector<int> adj[maxn];
int a[maxn], b[maxn], n, par[maxn], a0, b0;
long long ans;
int dep[maxn], id[maxn], idx;
vector<pair<int, int> > chain;
bool vis[maxn];
void dfs(int u) {
  id[++idx] = u;
  for (auto v : adj[u])
    if (v != par[u]) {
      par[v] = u;
      dep[v] = dep[u] + 1;
      dfs(v);
    }
}
int lca(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  while (dep[u] > dep[v]) u = par[u];
  while (u != v) u = par[u], v = par[v];
  return u;
}
int dist(int u, int v) { return dep[u] + dep[v] - 2 * dep[lca(u, v)]; }
int stk[maxn];
void move(int *a, int u, int v) {
  int t = lca(u, v), top = 0;
  for (int i = u; i != t; i = par[i]) swap(a[par[i]], a[i]);
  for (int i = v; i != t; i = par[i]) stk[++top] = i;
  while (top) swap(a[par[stk[top]]], a[stk[top]]), --top;
}
bool check() {
  for (int i = 1; i <= (n); i++)
    if (a[i] != b[i]) return false;
  return true;
}
int cir[maxn], tot;
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= (n); i++) scanf("%d", &a[i]);
  for (int i = 1; i <= (n); i++) scanf("%d", &b[i]);
  for (int u, v, i = 1; i < n; i++)
    scanf("%d %d", &u, &v), adj[u].push_back(v), adj[v].push_back(u);
  for (int i = 1; i <= (n); i++) a[i] == 0 ? a0 = i : 0;
  for (int i = 1; i <= (n); i++) b[i] == 0 ? b0 = i : 0;
  dfs(b0);
  move(a, a0, b0);
  if (check()) {
    printf("0 %d", dist(a0, b0));
    return 0;
  }
  for (int i = 1; i <= (n); i++)
    if (a[i] == b[i]) vis[i] = true;
  for (int i = (n); i >= 1; i--)
    if (!vis[id[i]]) {
      int u = id[i], v = u;
      vis[u] = true;
      while (par[v] && !vis[par[v]]) v = par[v], vis[v] = true;
      chain.push_back(pair<int, int>(u, v));
    }
  move(a, b0, a0);
  if (chain.size() > 2) {
    printf("-1");
    return 0;
  }
  if (chain.size() == 2) {
    if (par[chain[0].second] != par[chain[1].second]) {
      printf("-1");
      return 0;
    }
    int t = par[chain[0].second], ansu = chain[0].first, ansv = chain[1].first;
    for (int i = ansu; i != t; i = par[i]) cir[++tot] = i;
    int mid = tot;
    for (int i = ansv; i != t; i = par[i]) cir[++tot] = i;
    reverse(cir + mid + 1, cir + tot + 1);
    int brk = t, tmp = 0;
    if (dep[lca(a0, ansu)] > dep[brk]) {
      brk = lca(a0, ansu);
      tmp = dist(brk, t);
      move(a, a0, brk);
      move(b, b0, t);
      move(a, brk, t);
    } else if (dep[lca(a0, ansv)] > dep[brk]) {
      brk = lca(a0, ansv);
      tmp = tot + 1 - dist(brk, t);
      move(a, a0, brk);
      move(b, b0, t);
      move(a, brk, ansv);
      swap(a[ansu], a[ansv]);
      move(a, ansu, t);
    } else {
      move(a, a0, t);
      move(b, b0, t);
    }
    ans = dist(a0, brk) + dist(b0, t);
    int shift = 0;
    for (int i = 1; i <= (tot); i++) cir[i + tot] = cir[i];
    for (int i = 1; i <= (tot); i++)
      if (a[cir[i]] == b[cir[1]]) shift = i - 1;
    for (int i = 1; i <= (tot); i++)
      if (a[cir[i + shift]] != b[cir[i]]) {
        printf("-1");
        return 0;
      }
    ans += min((long long)(tot + 1) * (tot - shift) - tmp,
               (long long)(tot + 1) * shift + tmp);
    if (ansu > ansv) swap(ansu, ansv);
    printf("%d %d %I64d", ansu, ansv, ans);
  }
  if (chain.size() == 1) {
    int bot = chain[0].first, t = par[chain[0].second];
    for (int i = bot; i != t; i = par[i]) cir[++tot] = i;
    int brk = lca(a0, bot);
    dep[brk] < dep[t] ? brk = t : 0;
    ans = dist(a0, brk) + dist(b0, t);
    move(a, a0, brk);
    move(b, b0, t);
    int tmp = dist(brk, t), shift = 0;
    move(a, brk, t);
    for (int i = 1; i <= (tot); i++) cir[i + tot] = cir[i];
    for (int i = 1; i <= (tot); i++)
      if (a[cir[i]] == b[cir[1]]) shift = i - 1;
    for (int i = 1; i <= (tot); i++)
      if (a[cir[i + shift]] != b[cir[i]]) {
        printf("-1");
        return 0;
      }
    ans += min((long long)(tot + 1) * (tot - shift) - tmp,
               (long long)(tot + 1) * shift + tmp);
    if (bot > t) swap(bot, t);
    printf("%d %d %I64d", bot, t, ans);
  }
  return 0;
}
