#include<iostream> #include<algorithm> #include<cstdio> using namespace std; typedef long long ll; const int N = 5e5 + 5; const ll INF = 1e18;
ll mn[N], f[N]; int stk[N], dep[N], p[N]; int fa[N][21], dfn[N], tot, top; struct Edge { int head[N], ver[N], net[N], edge[N], idx; void add(int a, int b, int c) { net[++idx] = head[a], ver[idx] = b, edge[idx] = c, head[a] = idx; } } e1, e2;
bool cmp(int a, int b) { return dfn[a] < dfn[b]; }
void dfs1(int u, int f) { fa[u][0] = f; dfn[u] = ++tot, dep[u] = dep[f] + 1; for (int i = 1; i <= 20; i++) fa[u][i] = fa[fa[u][i - 1]][i - 1]; for (int i = e1.head[u]; i; i = e1.net[i]) { int v = e1.ver[i]; if (v == f) continue; mn[v] = min(mn[u], 1LL * e1.edge[i]); dfs1(v, u); } }
int lca(int x, int y) { if (dep[x] < dep[y]) swap(x, y); for (int i = 20; i >= 0; i--) if (dep[fa[x][i]] >= dep[y]) x = fa[x][i]; if (x == y) return x; for (int i = 20; i >= 0; i--) if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i]; return fa[x][0]; }
void insert(int u) { if (top == 1) { if (u != 1) stk[++top] = u; return; } int l = lca(u, stk[top]); if (l == stk[top]) return; while (top > 1 && dfn[stk[top - 1]] >= dfn[l]) e2.add(stk[top - 1], stk[top], 0), top--; if (stk[top] != l) { e2.add(l, stk[top], 0); stk[top] = l; } stk[++top] = u; }
void dfs2(int u) { if (!e2.head[u]) f[u] = mn[u]; else { f[u] = 0; for (int i = e2.head[u]; i; i = e2.net[i]) { int v = e2.ver[i]; dfs2(v); f[u] += f[v]; } f[u] = min(f[u], mn[u]); e2.head[u] = 0; } }
int main() { int n, m; scanf("%d", &n); for (int i = 1; i < n; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); e1.add(u, v, w), e1.add(v, u, w); } mn[1] = INF; dfs1(1, 0); scanf("%d", &m); while (m--) { int k; scanf("%d", &k); for (int i = 1; i <= k; i++) scanf("%d", &p[i]); sort(p + 1, p + 1 + k, cmp); e2.idx = 0; stk[top = 1] = 1; for (int i = 1; i <= k; i++) insert(p[i]); while (top > 1) e2.add(stk[top - 1], stk[top], 0), top--; dfs2(1); printf("%lld\n", f[1]); } return 0; }