#include <bits/stdc++.h> #define F first #define S second using namespace std; typedef long long ll; struct c{ int cid,d,h; }; vector<c> cs[101010]; vector<pair<int, int> > g[101010]; int del[101010]; int aps[101010]; void caps(int x, int p){ aps[x]=0; if (del[x]){ return; } aps[x]=1; for (auto nx:g[x]){ if (nx.F!=p){ caps(nx.F, x); aps[x]+=aps[nx.F]; } } } int f=0; void dfs1(int x, int p, int n){ if (del[x]) return; int ma=n-aps[x]; for (auto nx:g[x]){ if (nx.F!=p){ dfs1(nx.F, x, n); ma=max(ma, aps[nx.F]); } } if (ma<=n/2){ f=x; } } int findc(int x){ caps(x, 0); f=x; dfs1(x, 0, aps[x]); return f; } int ces=1; int hs=1; void dfs2(int x, int p, int h, int c, int d){ if (del[x]) return; cs[x].push_back({c, d, h}); for (auto nx:g[x]){ if (nx.F!=p){ dfs2(nx.F, x, h, c, d+nx.S); } } } void calc(int x){ int tc=ces++; cs[x].push_back({tc, 0, hs++}); for (auto nx:g[x]){ dfs2(nx.F, x, hs++, tc, nx.S); } } void goc(int x){ x=findc(x); calc(x); del[x]=1; for (auto nx:g[x]){ if (!del[nx.F]){ goc(nx.F); } } } int hh[10101010]; int cc[10101010]; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n,t; cin>>n>>t; for (int i=0;i<n-1;i++){ int a,b,c; cin>>a>>b>>c; g[a].push_back({b, c}); g[b].push_back({a, c}); } goc(1); for (int i=0;i<t;i++){ int k; cin>>k; vector<int> ks(k); for (int j=0;j<k;j++){ cin>>ks[j]; for (auto c:cs[ks[j]]){ hh[c.h]++; cc[c.cid]++; } } ll v=0; for (int j=0;j<k;j++){ for (auto c:cs[ks[j]]){ v+=(ll)cc[c.cid]*(ll)c.d; v-=(ll)hh[c.h]*(ll)c.d; } } for (int j=0;j<k;j++){ for (auto c:cs[ks[j]]){ hh[c.h]--; cc[c.cid]--; } } cout<<v<<'\n'; } }