func_code_string: #include <bits/stdc++.h>   using namespace std;   int n;   long long K;   vector<int> E[200000 + 5];   void addEdge(int u, int v) {     E[u].push_back(v);     E[v].push_back(u);   }   int sz[200000 + 5], deep[200000 + 5], fa[200000 + 5];   int msz[200000 + 5], root;   void dfs1(int x, int f) {     sz[x] = 1;     msz[x] = 0;     for (int y : E[x]) {       if (y != f) {         dfs1(y, x);         sz[x] += sz[y];         msz[x] = max(msz[x], sz[y]);       }     }     msz[x] = max(msz[x], n - sz[x]);     if (root == 0 || msz[x] < msz[root]) root = x;   }   set<pair<int, int> > S[200000 + 5];   long long minans = 0, maxans = 0;   int sons[200000 + 5];   void dfs2(int x, int f, int rt) {     sz[x] = 1;     fa[x] = f;     deep[x] = deep[f] + 1;     for (int y : E[x]) {       if (y != f) {         sons[x]++;         dfs2(y, x, rt);         sz[x] += sz[y];       }     }     if (sz[x] > 1) S[rt].insert(make_pair(deep[x], x));     minans += sz[x] % 2;     maxans += sz[x];   }   bool vis[200000 + 5];   int getSon(int x) {     for (int t : E[x]) {       if (t != fa[x] && !vis[t]) {         vis[t] = 1;         return t;       }     }     return x;   }   void del(int x, int rt) {     vis[x] = 1;     sons[fa[x]]--;     if (sons[fa[x]] == 0) S[rt].erase(make_pair(deep[fa[x]], fa[x]));   }   priority_queue<pair<int, int> > q;   vector<int> ans;   void dfs3(int x) {     if (!vis[x]) ans.push_back(x);     for (int y : E[x])       if (y != fa[x]) dfs3(y);   }   int main() {     scanf( %d %lld , &n, &K);     for (int i = 1, u, v; i < n; i++) {       scanf( %d %d , &u, &v);       addEdge(u, v);     }     dfs1(1, 0);     for (int y : E[root]) {       dfs2(y, root, y);       q.push(make_pair(sz[y], y));     }     if (K >= minans && K <= maxans && (maxans - K) % 2 == 0) {       puts( YES );       K = (maxans - K) / 2;       while (K) {         int rt = q.top().second;         q.pop();         int lc = S[rt].rbegin()->second;         int d = deep[lc];         if (K >= d) {           K -= d;           int u = getSon(lc), v = getSon(lc);           del(u, rt);           del(v, rt);           printf( %d %d n , u, v);         } else {           int u = S[rt].lower_bound(make_pair(K, 0))->second;           int v = getSon(u);           del(u, rt);           del(v, rt);           printf( %d %d n , u, v);           break;         }         sz[rt] -= 2;         if (sz[rt] > 1) q.push(make_pair(sz[rt], rt));       }       dfs3(root);       for (int i = 0; i < (int)ans.size() / 2; i++)         printf( %d %d n , ans[i], ans[i + (int)ans.size() / 2]);     } else       puts( NO );   }   