#include using namespace std; const int INF = 10000000; struct monoid{ int mn; long long sum; monoid(): mn(INF), sum(0){ } }; monoid op(monoid A, monoid B){ monoid ans; ans.mn = min(A.mn, B.mn); if (ans.mn == A.mn){ ans.sum += A.sum; } if (ans.mn == B.mn){ ans.sum += B.sum; } return ans; } struct lazy_segment_tree{ int N; vector lazy; vector ST; lazy_segment_tree(){ } lazy_segment_tree(vector w){ int N2 = w.size(); N = 1; while (N < N2){ N *= 2; } ST = vector(N * 2 - 1); for (int i = 0; i < N2; i++){ ST[N - 1 + i].mn = 0; ST[N - 1 + i].sum = w[i]; } for (int i = N - 2; i >= 0; i--){ ST[i] = op(ST[i * 2 + 1], ST[i * 2 + 2]); } lazy = vector(N * 2 - 1, 0); } void push(int i){ if (i < N - 1){ lazy[i * 2 + 1] += lazy[i]; lazy[i * 2 + 2] += lazy[i]; } ST[i].mn += lazy[i]; lazy[i] = 0; } void range_add(int L, int R, int x, int i, int l, int r){ push(i); if (r <= L || R <= l){ return; } else if (L <= l && r <= R){ lazy[i] += x; push(i); } else { int m = (l + r) / 2; range_add(L, R, x, i * 2 + 1, l, m); range_add(L, R, x, i * 2 + 2, m, r); ST[i] = op(ST[i * 2 + 1], ST[i * 2 + 2]); } } void range_add(int L, int R, int x){ range_add(L, R, x, 0, 0, N); } monoid all(){ push(0); return ST[0]; } }; struct heavy_light_decomposition{ vector p, sz, in, next; lazy_segment_tree ST; heavy_light_decomposition(vector &p, vector> &c, vector &w): p(p){ int N = p.size(); sz = vector(N); dfs1(c); in = vector(N); next = vector(N, 0); int t = 0; dfs2(c, t); vector w2(N, 0); for (int i = 0; i < N; i++){ w2[in[i]] = w[i]; } ST = lazy_segment_tree(w2); } void dfs1(vector> &c, int v = 0){ sz[v] = 1; for (int &w : c[v]){ dfs1(c, w); sz[v] += sz[w]; if (sz[w] > sz[c[v][0]]){ swap(w, c[v][0]); } } } void dfs2(vector> &c, int &t, int v = 0){ in[v] = t; t++; for (int w : c[v]){ if (w == c[v][0]){ next[w] = next[v]; } else { next[w] = w; } dfs2(c, t, w); } } int lca(int u, int v){ while (true){ if (in[u] > in[v]){ swap(u, v); } if (next[u] == next[v]){ return u; } v = p[next[u]]; } } void path_add(int u, int v, int x){ int w = lca(u, v); while (next[u] != next[w]){ ST.range_add(in[next[u]], in[u] + 1, x); u = p[next[u]]; } ST.range_add(in[w] + 1, in[u] + 1, x); while (next[v] != next[w]){ ST.range_add(in[next[v]], in[v] + 1, x); v = p[next[v]]; } ST.range_add(in[w] + 1, in[v] + 1, x); } monoid get(){ return ST.all(); } }; int main(){ int N; cin >> N; vector>> E(N); for (int i = 0; i < N - 1; i++){ int u, v, w; cin >> u >> v >> w; E[u].push_back(make_pair(w, v)); E[v].push_back(make_pair(w, u)); } vector p(N, -1); vector> c(N); vector pw(N); queue q; q.push(0); while (!q.empty()){ int v = q.front(); q.pop(); for (pair e : E[v]){ int w = e.second; if (w != p[v]){ p[w] = v; c[v].push_back(w); pw[w] = e.first; q.push(w); } } } long long sum = 0; for (int i = 1; i < N; i++){ sum += pw[i]; } heavy_light_decomposition HLD(p, c, pw); int Q; cin >> Q; for (int i = 0; i < Q; i++){ int k; cin >> k; vector x(k); for (int j = 0; j < k; j++){ cin >> x[j]; } for (int j = 1; j < k; j++){ HLD.path_add(x[0], x[j], 1); } cout << sum - HLD.get().sum << endl; for (int j = 1; j < k; j++){ HLD.path_add(x[0], x[j], -1); } } }