func_code_string: #include<bits/stdc++.h>   using namespace std;      namespace program {    const int N = 100005;        struct edge {     int to, nxt;     edge() {}     edge(int to_, int nxt_): to(to_), nxt(nxt_) {}    } e[N << 1];    int hd[N], cnt, fir[N], end[N];    vector<pair<int, int> > del, ins;        void adde(int u, int v) {     e[++cnt] = edge(v, hd[u]); hd[u] = cnt;     e[++cnt] = edge(u, hd[v]); hd[v] = cnt;    }    bool dfs(int u, int fa) {     vector<int> son1, son2;     for(int i = hd[u]; i; i = e[i].nxt) {      int v = e[i].to;      if(v == fa) continue;      if(dfs(v, u)) {       son1.push_back(v);      }      else {       son2.push_back(v);      }     }     if(!son1.size()) {      end[u] = u;     }     else if(son1.size() == 1) {      end[u] = end[son1[0]];     }     else {      end[u] = end[son1[0]];      fir[u] = end[son1[1]];      if(fa) del.push_back(make_pair(fa, u));      for(int i = 2; i < son1.size(); ++i) {       del.push_back(make_pair(u, son1[i]));       ins.push_back(make_pair(end[u], son1[i]));       end[u] = end[son1[i]];      }     }     for(int i = 0; i < son2.size(); ++i) {      ins.push_back(make_pair(end[u], fir[son2[i]]));      end[u] = end[son2[i]];     }     return son1.size() <= 1;    }    int main() {     int T;     scanf( %d , &T);     while(T--) {      int n;      scanf( %d , &n);      cnt = 0;      memset(hd + 1, 0, sizeof(int) * n);      for(int i = 1; i < n; ++i) {       int u, v;       scanf( %d%d , &u, &v);       adde(u, v);      }      del.clear();      ins.clear();      dfs(1, 0);      printf( %d n , del.size());      for(int i = 0; i < del.size(); ++i) {       printf( %d %d %d %d n , del[i].first, del[i].second, ins[i].first, ins[i].second);      }     }     return 0;    }   }   int main() {    return program::main();   }