func_code_string: #include <bits/stdc++.h>   using namespace std;   int n;   namespace LCT {   int fa[500005], ch[500005][2];   bool rev[500005], val[500005];   bool isr(int x) { return ch[fa[x]][0] != x && ch[fa[x]][1] != x; }   bool isc(int x) { return ch[fa[x]][1] == x; }   void upd(int x) { val[x] = val[ch[x][0]] | val[ch[x][1]] | (x > n); }   void pd(int x) {     if (rev[x])       swap(ch[x][0], ch[x][1]), rev[x] = 0, rev[ch[x][0]] ^= 1,                                 rev[ch[x][1]] ^= 1;   }   void pdpath(int x) {     if (!isr(x)) pdpath(fa[x]);     pd(x);   }   void rot(int x) {     int y = fa[x], z = fa[y], c = isc(x);     if (!isr(y)) ch[z][ch[z][1] == y] = x;     fa[ch[y][c] = ch[x][!c]] = y;     fa[ch[x][!c] = y] = x, fa[x] = z;     upd(y);   }   void splay(int x) {     for (pdpath(x); !isr(x); rot(x))       if (!isr(fa[x])) rot(isc(fa[x]) == isc(x) ? fa[x] : x);     upd(x);   }   void access(int x) {     for (int y = 0; x; x = fa[y = x]) splay(x), ch[x][1] = y, upd(x);   }   void prefer(int x) { access(x), splay(x); }   void bert(int x) { prefer(x), rev[x] ^= 1; }   void link(int x, int y) { bert(x), fa[x] = y; }   void cut(int x, int y) { bert(x), prefer(y), fa[x] = ch[y][0] = 0, upd(y); }   int find(int x) {     pd(x);     if (val[ch[x][1]])       return find(ch[x][1]);     else       return x > n ? x : find(ch[x][0]);   }   }  // namespace LCT   using LCT::cut;   using LCT::link;   vector<int> G[500005];   int X[500005], Y[500005], deg[500005], stk[500005], top, fa[500005];   void dfs(int u) {     for (int i = G[u].size() - 1, v; i >= 0; i--)       if ((v = G[u][i]) != fa[u]) fa[v] = u, dfs(v);   }   int main() {     scanf( %d , &n);     for (int i = 1, x, y; i < n; i++)       scanf( %d%d , &x, &y), G[x].push_back(y), G[y].push_back(x);     for (int i = 1; i < n; i++)       scanf( %d%d , &X[i], &Y[i]), link(X[i], n + i), link(Y[i], n + i);     dfs(1);     for (int i = 1; i <= n; i++) deg[fa[i]]++;     for (int i = 1; i <= n; i++)       if (!deg[i]) stk[++top] = i;     printf( %d n , n - 1);     for (int i = 1, k; i < n; i++) {       int x = stk[i];       if (!--deg[fa[x]]) stk[++top] = fa[x];       LCT::bert(fa[x]), LCT::prefer(x);       k = LCT::find(LCT::ch[x][0]) - n;       printf( %d %d %d %d n , x, fa[x], X[k], Y[k]);       cut(X[k], n + k), cut(Y[k], n + k), link(x, fa[x]);     }   }   