func_code_string: #include <bits/stdc++.h>   using namespace std;   template <class P, class Q>   inline bool mmin(P &a, Q b) {     if (a > b) {       a = b;       return true;     }     return false;   }   template <class P, class Q>   inline bool mmax(P &a, Q b) {     if (a < b) {       a = b;       return true;     }     return false;   }   const int MAXn = 400 + 5, INF = 1000;   int n;   vector<pair<int, int> > adj[MAXn];   vector<int> son[MAXn];   int par[MAXn], siz[MAXn];   int dp[MAXn][MAXn];   int cur[MAXn][MAXn], upd[MAXn][MAXn];   bool mark[MAXn];   int nxt[MAXn];   inline void calcDP(int x) {     int m = ((int)son[x].size());     cur[m][0] = 0;     for (int j = 1; j < siz[x]; ++j) cur[m][j] = INF;     int s = 0;     for (int i = m - 1; i >= 0; --i) {       s += siz[son[x][i]];       for (int j = 0; j <= s; ++j) {         cur[i][j] = INF;         for (int k = 0; k <= j && k <= siz[son[x][i]]; ++k)           if (j - k <= s - siz[son[x][i]] &&               mmin(cur[i][j], cur[i + 1][j - k] + dp[son[x][i]][k]))             upd[i][j] = k;       }     }   }   void DFS(int x) {     siz[x] = 1;     for (int i = 0; i < ((int)adj[x].size()); ++i) {       int y = adj[x][i].first;       if (y != par[x]) {         son[x].push_back(y);         par[y] = x;         DFS(y);         siz[x] += siz[y];       }     }     calcDP(x);     dp[x][0] = 1;     for (int j = 1; j <= siz[x]; ++j) dp[x][j] = cur[0][j - 1];   }   void DFS2(int x, int k) {     if (!k) return;     mark[x] = 1;     if (k == 1) return;     calcDP(x);     int y = k - 1;     for (int i = 0; i < ((int)son[x].size()); ++i) {       nxt[son[x][i]] = upd[i][y];       y -= upd[i][y];     }     y = k - 1;     for (int i = 0; i < ((int)son[x].size()); ++i) {       DFS2(son[x][i], nxt[son[x][i]]);       y -= nxt[son[x][i]];     }   }   int main() {     ios_base::sync_with_stdio(false);     int k;     cin >> n >> k;     for (int i = 0; i < n - 1; ++i) {       int x, y;       cin >> x >> y;       --x;       --y;       adj[x].push_back(pair<int, int>(y, i + 1));       adj[y].push_back(pair<int, int>(x, i + 1));     }     fill(dp[0], dp[n], INF);     DFS(0);     int mn = dp[0][k], ind = 0;     for (int i = 1; i < n; ++i)       if (mmin(mn, dp[i][k] + 1)) ind = i;     DFS2(ind, k);     vector<int> v;     for (int i = 0; i < n; ++i)       for (int j = 0; j < ((int)adj[i].size()); ++j)         if (adj[i][j].first > i && (mark[i] ^ mark[adj[i][j].first]))           v.push_back(adj[i][j].second);     cout << ((int)v.size()) << endl;     for (int i = 0; i < ((int)v.size()); ++i) cout << v[i] <<    ;     cout << endl;     return 0;   }   