func_code_string: #include <bits/stdc++.h>   namespace pb_ds {   namespace io {   const int MaxBuff = 1 << 15;   const int Output = 1 << 23;   char B[MaxBuff], *S = B, *T = B;   char Out[Output], *iter = Out;   inline void flush() {     fwrite(Out, 1, iter - Out, stdout);     iter = Out;   }   }  // namespace io   template <class Type>   inline Type Read() {     using namespace io;     register char ch;     register Type ans = 0;     register bool neg = 0;     while (ch = ((S == T) && (T = (S = B) + fread(B, 1, MaxBuff, stdin), S == T)                      ? 0                      : *S++),            (ch <  0  || ch >  9 ) && ch !=  - )       ;     ch ==  -  ? neg = 1 : ans = ch -  0 ;     while (ch = ((S == T) && (T = (S = B) + fread(B, 1, MaxBuff, stdin), S == T)                      ? 0                      : *S++),             0  <= ch && ch <=  9 )       ans = ans * 10 + ch -  0 ;     return neg ? -ans : ans;   }   template <class Type>   inline void Print(register Type x, register char ch =   n ) {     using namespace io;     if (!x)       *iter++ =  0 ;     else {       if (x < 0) *iter++ =  - , x = -x;       static int s[100];       register int t = 0;       while (x) s[++t] = x % 10, x /= 10;       while (t) *iter++ =  0  + s[t--];     }     *iter++ = ch;   }   }  // namespace pb_ds   using namespace pb_ds;   using namespace std;   const int N = 55;   const int inf = 2e9;   struct edge {     int next, to;   } a[N << 1];   int head[N], cnt;   inline void add(int u, int v) {     a[++cnt].to = v;     a[cnt].next = head[u];     head[u] = cnt;   }   int n, m, st, now, ans = inf;   int w[N][N], c[N], deg[N];   int dp[N][N][N][N], f[2][N];   void dfs(int x, int fa) {     for (int i = head[x]; i; i = a[i].next) {       int y = a[i].to;       if (y == fa) continue;       dfs(y, x), c[x] += c[y];     }   }   int solve(int u, int v, int s1, int s2) {     if (!s1) return s2 ? inf : 0;     if (~dp[u][v][s1][s2]) return dp[u][v][s1][s2];     if (deg[v] == 1) return dp[u][v][s1][s2] = (solve(v, u, s2, 0) + w[u][v]);     for (int i = head[v]; i; i = a[i].next) {       int y = a[i].to;       if (y == u) continue;       for (int j = 0; j <= s1; ++j) solve(v, y, j, s1 + s2 - j);     }     memset(f[0], 0, sizeof(f[0])), f[now = 0][0] = inf;     for (int i = head[v]; i; i = a[i].next) {       int y = a[i].to;       if (y == u) continue;       now ^= 1;       memset(f[now], 0, sizeof(f[now]));       for (int j = 0; j <= s1; ++j) {         for (int k = 0; j + k <= s1; ++k) {           f[now][j + k] =               max(f[now][j + k], min(f[now ^ 1][j], solve(v, y, k, s1 + s2 - k)));         }       }     }     return (dp[u][v][s1][s2] = (f[now][s1] + w[u][v]));   }   int main() {     n = Read<int>();     for (int i = 1; i < n; ++i) {       int u = Read<int>(), v = Read<int>();       w[u][v] = w[v][u] = Read<int>();       add(u, v), add(v, u);       ++deg[u], ++deg[v];     }     st = Read<int>(), m = Read<int>();     for (int i = 1; i <= m; ++i) ++c[Read<int>()];     dfs(st, 0), memset(dp, -1, sizeof(dp));     for (int i = head[st]; i; i = a[i].next)       ans = min(ans, solve(st, a[i].to, c[a[i].to], m - c[a[i].to]));     printf( %d n , ans);     return 0;   }   