func_code_string: #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;   }   