func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e5 + 10;   void qr(int &x) { scanf( %d , &x); }   int n, sz[N], f[N], root, c[N];   long long k, mn, mx;   struct edge {     int y, next;   } a[N * 2];   int len, last[N];   void ins(int x, int y) {     a[++len] = (edge){y, last[x]};     last[x] = len;   }   void dfs1(int x, int fa) {     sz[x] = f[x] = 1;     for (int k = last[x], y; k; k = a[k].next) {       y = a[k].y;       if (y ^ fa) {         dfs1(y, x);         sz[x] += sz[y];         mn += sz[y] & 1;         mx += min(sz[y], n - sz[y]);         f[x] = max(f[x], sz[y]);       }     }     f[x] = max(f[x], n - sz[x]);   }   void dfs2(int x, int fa) {     sz[x] = 1;     for (int k = last[x], y; k; k = a[k].next) {       y = a[k].y;       if (y ^ fa) {         dfs2(y, x);         sz[x] += sz[y];       }     }     c[sz[x]]++;   }   vector<int> d[N];   int son[N], tot, A[N], B[N];   void dfs3(int x, int fa) {     sz[x] = 1;     for (int k = last[x], y; k; k = a[k].next)       if ((y = a[k].y) ^ fa) dfs3(y, x), sz[x] += c[y];     int C = (sz[x] - c[x]) >> 1, st = 1, ed;     son[tot = 1] = x;     d[x].push_back(x);     for (int k = last[x], y; k; k = a[k].next)       if ((y = a[k].y) ^ fa) son[++tot] = y;     ed = tot;     for (int i = 1; i <= C; i++) {       while (d[son[st]].empty()) st++;       A[i] = d[son[st]].back();       d[son[st]].pop_back();       while (d[son[ed]].empty()) ed--;       B[i] = d[son[ed]].back();       d[son[ed]].pop_back();     }     for (int i = 1; i <= C; i++) printf( %d %d n , A[i], B[C - i + 1]);     for (int i = 2; i <= tot; i++) {       if (d[son[i]].size() > d[x].size()) swap(d[x], d[son[i]]);       for (int j : d[son[i]]) d[x].push_back(j);     }   }   int main() {     qr(n);     scanf( %lld , &k);     for (int i = 1, x, y; i < n; i++) qr(x), qr(y), ins(x, y), ins(y, x);     dfs1(1, 0);     if (!(mn <= k && k <= mx) || (k - mn) % 2 == 1) puts( NO ), exit(0);     root = 1;     for (int i = 2; i <= n; i++)       if (f[i] < f[root]) root = i;     dfs2(root, 0);     int p = n - 1;     for (; p > 1; p--)       if (mx - c[p] * 2 >= k) {         mx -= c[p] * 2;         c[p - 2] += c[p];       } else         break;     for (int i = 1; i <= n; i++) c[i] = min(sz[i], p - (p + sz[i]) % 2);     c[root] = 0;     for (int i = 1; i <= n; i++)       if (c[i] == p && mx > k) {         mx -= 2;         c[i] -= 2;       }     puts( YES );     dfs3(root, 0);     return 0;   }   