func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<int> v[200010], circle;   int fa[200010], dep[200010], a[200010], b[200010], n, rt, vs, vt, h1, h2;   bool vis[200010], bo[200010];   inline int rd() {     int x = 0;     char ch = getchar();     for (; ch <  0  || ch >  9 ; ch = getchar())       ;     for (; ch >=  0  && ch <=  9 ; ch = getchar()) x = x * 10 + ch -  0 ;     return x;   }   inline void dfs(int x) {     for (int i = 0, siz = v[x].size(); i < siz; i++) {       int t = v[x][i];       if (t == fa[x]) continue;       dep[t] = dep[x] + 1;       fa[t] = x;       dfs(t);     }   }   inline bool gao() {     int p = 0, q = 0;     bool flag = true;     for (int i = 1; i <= n; i++)       if (a[i] != b[i] && dep[i] > dep[p]) p = i;     if (!p) return true;     for (int hh = p; a[hh] != b[hh]; hh = fa[hh])       bo[hh] = true, circle.push_back(hh);     for (int i = 1; i <= n; i++)       if (a[i] != b[i] && !bo[i] && dep[i] > dep[q]) q = i;     if (q) {       reverse(circle.begin(), circle.end());       flag = false;       for (int hh = q; a[hh] != b[hh]; hh = fa[hh])         bo[hh] = true, circle.push_back(hh);     } else       q = fa[circle.back()];     for (int i = 1; i <= n; i++)       if (a[i] != b[i] && !bo[i]) return false;     int h1 = p, h2 = q;     for (; h1 != h2; h1 = fa[h1])       if (dep[h1] < dep[h2]) swap(h1, h2);     rt = h1;     if (circle.size() != dep[p] + dep[q] - dep[rt] * 2) return false;     vs = p;     vt = q;     if (flag) reverse(circle.begin(), circle.end());     return true;   }   int main() {     n = rd();     for (int i = 1; i <= n; i++)       if (!(a[i] = rd())) h1 = i;     for (int i = 1; i <= n; i++)       if (!(b[i] = rd())) h2 = i;     for (int i = 1; i < n; i++) {       int x = rd(), y = rd();       v[x].push_back(y);       v[y].push_back(x);     }     dep[0] = -1;     dfs(h2);     for (int hh = h1; hh != h2; hh = fa[hh]) swap(a[hh], a[fa[hh]]);     long long ans = dep[h1];     if (!gao()) {       puts( -1 );       return 0;     }     if (!circle.size()) {       printf( 0 %d n , ans);       return 0;     }     for (int i = h1; i; i = fa[i]) vis[i] = true;     if (vis[circle.back()] && !vis[circle[0]])       reverse(circle.begin(), circle.end());     int gap = 0, siz = circle.size();     for (int i = 0; i < siz; i++)       if (b[circle[i]] == a[circle[0]]) gap = i;     for (int i = 0; i < siz; i++)       if (b[circle[(i + gap) % siz]] != a[circle[i]]) {         puts( -1 );         return 0;       }     if (vis[circle[0]] || vis[circle.back()]) {       int now = siz;       for (int i = 0; i < siz; i++)         if (!vis[circle[i]]) {           now = i;           break;         }       ans = ans - now +             min((long long)gap * (siz + 1) + now,                 abs((long long)(siz - gap) * (siz + 1) - now));     } else       ans = (ans + (long long)min(gap, siz - gap) * (siz + 1));     for (; !vis[rt]; rt = fa[rt]) ans += 2;     if (vs > vt) swap(vs, vt);     printf( %d %d %I64d n , vs, vt, ans);     return 0;   }   