func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, m, qu, f[100005], v[100005 + 100005], o[100005 + 100005], p, s[100005],       r, fr[100005], to[100005], si[100005], curm, grp[100005], gr, rt[100005];   bool u[100005], vis[100005];   vector<int> b[100005], c[100005], q[100005], ans[100005];   void bd(int a, int b) {     v[++p] = b;     o[p] = f[a];     f[a] = p;   }   void merge(vector<int> &a, vector<int> b) {     vector<int> c;     int l = 0, r = 0;     while (l < a.size() || r < b.size()) {       if (l == a.size())         c.push_back(b[r++]);       else if (r == b.size())         c.push_back(a[l++]);       else if (a[l] < b[r])         c.push_back(a[l++]);       else         c.push_back(b[r++]);     }     a = c;     if (a.size() > 11) a.resize(11);   }   void size(int x, int y) {     s[x] = vis[x] = 1;     for (int i = (f[x]); i; i = o[i])       if (v[i] != y && !u[v[i]]) {         size(v[i], x);         s[x] += s[v[i]];       }   }   void pick(int x, int y, int z) {     int m = s[z] - s[x];     for (int i = (f[x]); i; i = o[i])       if (v[i] != y && !u[v[i]]) {         pick(v[i], x, z);         m = max(m, s[v[i]]);       }     if (m < curm) {       curm = m;       r = x;     }   }   void group(int x, int y, int z) {     grp[x] = z;     for (int i = (f[x]); i; i = o[i])       if (v[i] != y && !u[v[i]]) group(v[i], x, z);   }   void dfs(int x, int y) {     c[x] = c[y];     merge(c[x], b[x]);     for (int i = (0); i < (q[x].size()); i++) {       int d = q[x][i];       if (vis[fr[d]] && vis[to[d]] && grp[fr[d]] != grp[to[d]]) {         merge(ans[d], c[x]);         rt[d] = r;       }     }     for (int i = (f[x]); i; i = o[i])       if (v[i] != y && !u[v[i]]) dfs(v[i], x);   }   void reset(int x, int y) {     vis[x] = 0;     for (int i = (f[x]); i; i = o[i])       if (v[i] != y && !u[v[i]]) reset(v[i], x);   }   void root(int x) {     size(x, 0);     curm = 100005;     pick(x, 0, x);     grp[r] = 0;     gr = 1;     u[r] = 1;     for (int i = (f[r]); i; i = o[i])       if (!u[v[i]]) group(v[i], r, gr++);     for (int i = (0); i < (q[r].size()); i++) {       int d = q[r][i];       if (vis[fr[d]] && vis[to[d]]) rt[d] = r;     }     for (int i = (f[r]); i; i = o[i])       if (!u[v[i]]) dfs(v[i], 0);     reset(r, 0);     for (int i = (f[r]); i; i = o[i])       if (!u[v[i]]) root(v[i]);   }   int main() {     scanf( %d %d %d , &n, &m, &qu);     for (int i = (1); i < (n); i++) {       int a, b;       scanf( %d %d , &a, &b);       bd(a, b);       bd(b, a);     }     for (int i = (1); i <= (m); i++) {       int t;       scanf( %d , &t);       b[t].push_back(i);     }     for (int i = (1); i <= (n); i++)       if (b[i].size() > 11) b[i].resize(11);     for (int i = (1); i <= (qu); i++) {       scanf( %d %d %d , &fr[i], &to[i], &si[i]);       q[fr[i]].push_back(i);       q[to[i]].push_back(i);     }     root(1);     for (int i = (1); i <= (qu); i++) {       merge(ans[i], b[rt[i]]);       if (ans[i].size() > si[i]) ans[i].resize(si[i]);       printf( %d , ans[i].size());       for (int j = (0); j < (ans[i].size()); j++) printf(  %d , ans[i][j]);       puts(  );     }     scanf(  n );   }   