func_code_string: #include <bits/stdc++.h>   const int MAXN = 100005;   using namespace std;   int n, m, q, v, u, a;   vector<int> E[MAXN], c[MAXN];   int L[MAXN], P[MAXN][17], M[MAXN][17][10], res[20], aux[20], cc[10];   void dfs(int cur, int prev) {     P[cur][0] = prev;     L[cur] = L[prev] + 1;     for (auto to : E[cur])       if (to != prev) dfs(to, cur);   }   void precalc() {     for (int j = 1; (1 << j) <= n; j++)       for (int i = 1; i <= n; i++) P[i][j] = P[P[i][j - 1]][j - 1];     for (int j = 1; (1 << j) <= n; j++) {       for (int i = 1; i <= n; i++) {         fill(aux, aux + 20, 1000000);         merge(M[i][j - 1], M[i][j - 1] + 10, M[P[i][j - 1]][j - 1],               M[P[i][j - 1]][j - 1] + 10, aux);         for (int h = 0; h < 10; h++) M[i][j][h] = aux[h];       }     }   }   int LCA(int x, int y) {     if (L[x] < L[y]) swap(x, y);     for (int j = 16; j >= 0; j--)       if (L[x] - (1 << j) >= L[y]) {         merge(res, res + 10, M[x][j], M[x][j] + 10, aux);         for (int h = 0; h < 10; h++) res[h] = aux[h];         x = P[x][j];       }     if (x == y) return x;     for (int j = 16; j >= 0; j--)       if (P[x][j] != 0 && P[x][j] != P[y][j]) {         merge(res, res + 10, M[x][j], M[x][j] + 10, aux);         for (int h = 0; h < 10; h++) res[h] = aux[h];         merge(res, res + 10, M[y][j], M[y][j] + 10, aux);         for (int h = 0; h < 10; h++) res[h] = aux[h];         x = P[x][j];         y = P[y][j];       }     merge(res, res + 10, M[x][0], M[x][0] + 10, aux);     for (int h = 0; h < 10; h++) res[h] = aux[h];     merge(res, res + 10, M[y][0], M[y][0] + 10, aux);     for (int h = 0; h < 10; h++) res[h] = aux[h];     return P[x][0];   }   int main() {     scanf( %d%d%d , &n, &m, &q);     for (int i = 1; i < n; i++) {       scanf( %d%d , &v, &u);       E[v].emplace_back(u);       E[u].emplace_back(v);     }     for (int i = 1; i <= m; i++) {       scanf( %d , &a);       c[a].emplace_back(i);     }     dfs(1, 0);     for (int i = 0; i <= n; i++)       for (int j = 0; (1 << j) <= n; j++)         for (int h = 0; h < 10; h++) M[i][j][h] = 1000000;     for (int i = 1; i <= n; i++) sort((c[i]).begin(), (c[i]).end());     for (int i = 1; i <= n; i++)       for (int h = 0; h < min((int)c[i].size(), 10); h++) M[i][0][h] = c[i][h];     precalc();     while (q--) {       scanf( %d%d%d , &v, &u, &a);       fill(cc, cc + 20, 1000000);       fill(res, res + 20, 1000000);       int lca = LCA(v, u), sz = 0;       for (int h = 0; h < min((int)c[lca].size(), 10); h++) cc[h] = c[lca][h];       merge(res, res + 10, cc, cc + 10, aux);       for (int h = 0; h < min(a, 10) && aux[h] != 1000000; h++) sz++;       printf( %d  , sz);       for (int h = 0; h < sz; h++) printf( %d  , aux[h]);       printf(  n );     }   }   