func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 52;   struct node {     int v, w, nxt;   } e[N << 1];   int s, n, m, first[N], cnt = 1, siz[N], de[N];   inline void add(int u, int v, int w) {     e[++cnt].v = v;     e[cnt].w = w;     e[cnt].nxt = first[u];     first[u] = cnt;     ++de[u];   }   inline void dfs(int u, int f) {     for (int i = first[u]; i; i = e[i].nxt) {       int v = e[i].v;       if (v == f) continue;       dfs(v, u);       siz[u] += siz[v];     }   }   int dp[N << 1][N][N];   inline int solve(int i, int x, int y) {     if (x + y == 0) return 0;     int v = e[i].v;     int &f = dp[i][x][y];     if (f != -1) return f;     if (de[v] == 1) {       if (y == 0)         return 0;       else {         f = solve(i ^ 1, y, 0) + e[i].w;         return f;       }     }     int g[N];     memset(g, 0, sizeof(g));     g[0] = 0x3f3f3f3f;     for (int j = first[v]; j; j = e[j].nxt) {       if (j == (i ^ 1)) continue;       for (int k = x; k >= 1; --k)         for (int w = k; w; --w)           g[k] = max(g[k], min(g[k - w], e[j].w + solve(j, w, x + y - w)));     }     return f = g[x];   }   int main() {     memset(dp, -1, sizeof(dp));     scanf( %d , &n);     for (int i = 1, u, v, w; i < n; ++i) {       scanf( %d%d%d , &u, &v, &w);       add(u, v, w);       add(v, u, w);     }     scanf( %d%d , &s, &m);     for (int i = 1, x; i <= m; ++i) {       scanf( %d , &x);       siz[x]++;     }     dfs(s, 0);     int ans = 0x3f3f3f3f;     for (int i = first[s]; i; i = e[i].nxt) {       int v = e[i].v;       ans = min(ans, solve(i, siz[v], m - siz[v]) + e[i].w);     }     cout << ans << endl;     return 0;   }   