func_code_string: #include <bits/stdc++.h>   using namespace std;   const int INF = 1e9;   const int N = 55;   int n, cnt[N];   vector<pair<int, int> > adj[N];   void dfs(int u, int p, int depth, vector<pair<int, int> > &leaves) {     bool leaf = 1;     for (auto e : adj[u]) {       int v, c;       tie(v, c) = e;       if (v == p) continue;       dfs(v, u, depth + c, leaves);       leaf = 0;     }     if (leaf) leaves.emplace_back(u, depth);   }   int dp[N][N], best[N][N];   int go(int root, int pre, int total, int put) {     vector<pair<int, int> > leaves;     dfs(root, pre, 0, leaves);     int sz = ((int)(leaves).size());     for (int from = (int)(sz + 1) - 1; from >= ((int)0); from--) {       for (int left = (int)(0); left < ((int)put + 1); left++) {         if (from == sz) {           best[from][left] = (left ? -INF : INF);         } else {           best[from][left] = best[from + 1][left];           int l = leaves[from].first, cost = leaves[from].second;           for (int pick = 1; pick <= left; pick++) {             best[from][left] =                 max(best[from][left],                     min(cost + dp[l][total - pick], best[from + 1][left - pick]));           }         }       }     }     return best[0][put];   }   void dfsSize(int u, int p) {     for (auto e : adj[u]) {       int v, c;       tie(v, c) = e;       if (v == p) continue;       dfsSize(v, u);       cnt[u] += cnt[v];     }   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     cin >> n;     for (int _ = 0; _ < (int)(n - 1); _++) {       int u, v, c;       cin >> u >> v >> c;       u--;       v--;       adj[u].emplace_back(v, c);       adj[v].emplace_back(u, c);     }     int s;     cin >> s;     s--;     int m;     cin >> m;     for (int _ = 0; _ < (int)(m); _++) {       int u;       cin >> u;       cnt[u - 1]++;     }     for (int total = 1; total <= m; total++) {       for (int u = 0; u < (int)(n); u++) {         dp[u][total] = go(u, u, total, total);       }     }     dfsSize(s, -1);     int ans = INF;     for (auto e : adj[s]) {       int v, c;       tie(v, c) = e;       ans = min(ans, c + go(v, s, m, cnt[v]));     }     cout << ans << endl;     return 0;   }   