func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<int> g[100006];   vector<int> located[100006];   int parent[100006], level[100006], visited[100006];   int ancestor[100006][18];   vector<int> st[100006][18];   void dfs(int u) {     visited[u] = 1;     for (int i = 0; i < g[u].size(); i++) {       int v = g[u][i];       if (visited[v] == 0) {         parent[v] = u;         level[v] = level[u] + 1;         dfs(v);       }     }   }   void merge(vector<int>& a, vector<int>& b) {     sort(a.begin(), a.end());     sort(b.begin(), b.end());     vector<int> tmp;     int cnt = 0;     int l1 = a.size(), l2 = b.size();     int i = 0, j = 0;     while (i < l1 && j < l2 && cnt < 10) {       if (a[i] < b[j])         tmp.push_back(a[i++]);       else         tmp.push_back(b[j++]);       cnt++;     }     while (i < l1 && cnt < 10) {       tmp.push_back(a[i++]);       cnt++;     }     while (j < l2 && cnt < 10) {       tmp.push_back(b[j++]);       cnt++;     }     a.clear();     for (i = 0; i < cnt; i++) a.push_back(tmp[i]);   }   int main() {     int tc = 1;     for (int t = 1; t <= tc; t++) {       int n, m, q;       scanf( %d , &(n));       scanf( %d , &(m));       scanf( %d , &(q));       for (int j = 1; j < 18; j++) {         for (int i = 1; i <= n; i++) {           ancestor[i][j] = -1;         }       }       for (int i = 1; i < n; i++) {         int u, v;         scanf( %d , &(u));         scanf( %d , &(v));         g[u].push_back(v);         g[v].push_back(u);       }       for (int i = 1; i <= m; i++) {         int tmp;         scanf( %d , &(tmp));         located[tmp].push_back(i);       }       parent[1] = -1;       level[1] = 1;       dfs(1);       for (int i = 1; i <= n; i++) ancestor[i][0] = parent[i];       for (int j = 1; j < 18; j++) {         for (int i = 1; i <= n; i++) {           if (ancestor[i][j - 1] != -1)             ancestor[i][j] = ancestor[ancestor[i][j - 1]][j - 1];         }       }       for (int i = 1; i <= n; i++) {         st[i][0] = located[i];         vector<int> vi;         merge(st[i][0], vi);       }       for (int j = 1; j < 18; j++) {         for (int i = 1; i <= n; i++) {           st[i][j] = st[i][j - 1];           if (ancestor[i][j - 1] == -1) continue;           merge(st[i][j], st[ancestor[i][j - 1]][j - 1]);         }       }       while (q--) {         int u, v, a;         scanf( %d , &(u));         scanf( %d , &(v));         scanf( %d , &(a));         if (level[u] < level[v]) {           int tmp = u;           u = v;           v = tmp;         }         vector<int> tmp;         for (int j = 17; j >= 0; j--) {           if (ancestor[u][j] != -1 && level[ancestor[u][j]] >= level[v]) {             merge(tmp, st[u][j]);             u = ancestor[u][j];           }         }         if (u != v) {           for (int j = 17; j >= 0; j--) {             if (ancestor[u][j] != -1 && ancestor[u][j] != ancestor[v][j]) {               merge(tmp, st[u][j]);               merge(tmp, st[v][j]);               u = ancestor[u][j];               v = ancestor[v][j];             }           }           merge(tmp, st[u][0]);           merge(tmp, st[v][0]);           u = parent[u];           v = parent[v];         }         merge(tmp, st[u][0]);         int cnt = 0;         int len = tmp.size();         cout << min(a, len);         for (int it = 0; it < tmp.size() && cnt < a; it++, cnt++) {           printf(   );           printf( %d , (tmp[it]));         }         printf(  n );       }     }   }   