//Pranet Verma #include <bits/stdc++.h> using namespace std; #define pii pair<int,int> const int N=100010; vector<pii> g[N]; int sz[N],heavy[N],chain[N],freq[N],pos[N],pool,dep[N],base,NN,tree[N<<2],pa[N]; long long sum[N]; void dfs(int u,int p,int w) { sz[u]=1; sum[u]=sum[p]+w; dep[u]=dep[p]+1; pa[u]=p; for(int i=0;i<(int)g[u].size();++i) { int v=g[u][i].first; int _w=g[u][i].second; if(v==p) continue; dfs(v,u,_w); sz[u]+=sz[v]; if(sz[v]>sz[heavy[u]]) heavy[u]=v; } } void hld(int u,int p,int id) { pos[u]=++pool; chain[u]=id; if(heavy[u]) hld(heavy[u],u,id); for(int i=0;i<(int)g[u].size();++i) { int v=g[u][i].first; if(v==p || v==heavy[u]) continue; hld(v,u,v); } } int merge(int u,int v) { return dep[u]>dep[v]?u:v; } void mu(int u) { while(u) { int p=(u-1)/2; if(u&1) tree[p]=merge(tree[u],tree[u+1]); else tree[p]=merge(tree[u],tree[u-1]); u=p; } } int qst(int u,int l,int r,int x,int y) { if(x>r || y<l) return 0; if(x<=l && r<=y) return tree[u]; return merge(qst(2*u+1,l,(l+r)/2,x,y),qst(2*u+2,(l+r)/2+1,r,x,y)); } #define ppi pair<pii,int> priority_queue<ppi> Q; int getNext(int u) { tree[base+pos[u]]=0; mu(base+pos[u]); int v=qst(0,0,base,pos[chain[u]],pos[u]); if(v==0) v=pa[chain[u]]; if(v==0) return 0; if(!tree[base+pos[v]]) { tree[base+pos[v]]=v; mu(base+pos[v]); Q.push(make_pair(make_pair(dep[chain[v]],dep[v]),v)); } return v; } int main() { int n,q; scanf("%d%d",&n,&q); NN=ceil(log2(n)); base=(1<<NN)-1; for(int i=1;i<n;++i) { int u,v,w; scanf("%d%d%d",&u,&v,&w); g[u].push_back(make_pair(v,w)); g[v].push_back(make_pair(u,w)); } dfs(1,0,0); hld(1,0,1); while(q--) { long long ans=0; int k; scanf("%d",&k); for(int i=0;i<k;++i) { int u; scanf("%d",&u); if(!freq[u]) { Q.push(make_pair(make_pair(dep[chain[u]],dep[u]),u)); tree[base+pos[u]]=u; mu(base+pos[u]); } freq[u]++; } while(!Q.empty()) { int u=Q.top().second; Q.pop(); int v=getNext(u); ans+=(long long)(k-freq[u])*freq[u]*(sum[u]-sum[v]); freq[v]+=freq[u]; freq[u]=0; } printf("%lld\n",ans); freq[0]=0; } }