func_code_string: #include <bits/stdc++.h>   using namespace std;   struct RTC {};   const int maxn = 123456 + 5;   int n;   int root;   bool humans[maxn];   vector<int> g_tmp[maxn], g[maxn];   ;   bool cut(int u, int p = -1) {     bool ret = humans[u];     for (int v : g_tmp[u]) {       if (v == p) continue;       if (cut(v, u)) {         ret = true;         g[u].push_back(v);       }     }     return ret;   }   int cnt[maxn];   int deep[maxn];   void count(int u) {     cnt[u] = 1;     deep[u] = 0;     for (int v : g[u]) {       count(v);       cnt[u] += cnt[v];       deep[u] = max(deep[u], 1 + deep[v]);     }   }   int maxlen = -1, id = -1;   void solve(int u, int up) {     if (humans[u]) {       int res = max(deep[u], up);       if (res > maxlen) {         maxlen = res;         id = u;       } else if (res == maxlen) {         id = min(id, u);       }     }     if (((int)(g[u]).size()) > 0) {       int down_v = 0;       for (int i = 1; i < ((int)(g[u]).size()); i++)         if (deep[g[u][i]] > deep[g[u][down_v]]) down_v = i;       if (up >= (deep[g[u][down_v]] + 1)) {         for (int v : g[u]) solve(v, up + 1);       } else {         for (int i = 0; i < (((int)(g[u]).size())); i++) {           if (i == down_v) continue;           solve(g[u][i], deep[g[u][down_v]] + 2);         }         int second_down_v = -1;         for (int i = 0; i < (((int)(g[u]).size())); i++) {           if (i == down_v) continue;           if (second_down_v == -1 || deep[g[u][i]] > deep[g[u][second_down_v]])             second_down_v = i;         }         if (second_down_v == -1 || up >= (deep[g[u][second_down_v]] + 1))           solve(g[u][down_v], up + 1);         else           solve(g[u][down_v], deep[g[u][second_down_v]] + 2);       }     }   }   int N;   int main() {     int m;     scanf( %d %d , &n, &m);     for (int i = 0; i < (n - 1); i++) {       int u, v;       scanf( %d %d , &u, &v);       g_tmp[u].push_back(v);       g_tmp[v].push_back(u);     }     while (m--) {       int u;       scanf( %d , &u);       humans[u] = true;       root = u;     }     cut(root);     count(root);     N = cnt[root];     solve(root, 0);     int arcos = N - 1;     printf( %d n%d n , id, 2 * arcos - maxlen);     return 0;   }   