#include<bits/stdc++.h> #define LL long long #define PII pair<int,int> #define mp make_pair #define fi first #define se second using namespace std; int n,t,seq[100005][18],dis[100005][18]; int siz[100005],ms[100005],z; bool vis[100005]; vector<PII> V[100005]; int Q[1000005]; bool cmp(int a,int b){ for(int i=0;i<18;i++){ if(seq[a][i]<seq[b][i]) return true; if(seq[a][i]>seq[b][i]) return false; } return false; } void d1(int id,int prev){ siz[id]=1; ms[id]=0; for(int i=0;i<V[id].size();i++){ int to=V[id][i].fi; if(to!=prev && !vis[to]){ d1(to,id); siz[id]+=siz[to]; ms[id]=max(ms[id],siz[to]); } } return; } void d2(int id,int prev,int tar){ if(tar>=2*(max(ms[id],tar-siz[id]))) z=id; if(z!=-1) return; for(int i=0;i<V[id].size();i++){ int to=V[id][i].fi; if(to!=prev && !vis[to]){ d2(to,id,tar); } } return; } void d3(int id,int prev,int lev,int len,int nu){ dis[id][lev]=len; seq[id][lev]=nu; for(int i=0;i<V[id].size();i++){ PII to=V[id][i]; if(!vis[to.fi] && to.fi!=prev){ d3(to.fi,id,lev,len+to.se,nu); } } return; } void dfs(int id,int prev,int lev){ d1(id,prev); z=-1; d2(id,prev,siz[id]); int zz=z,num=0; vis[zz]=true; seq[zz][lev]=0; for(int i=0;i<V[zz].size();i++){ PII to=V[zz][i]; if(!vis[to.fi]){ d3(to.fi,zz,lev,to.se,++num); } } for(int i=0;i<V[zz].size();i++){ if(!vis[V[zz][i].fi]){ dfs(V[zz][i].fi,zz,lev+1); } } return; } LL ans; void f(int l,int r,int lev){ if(Q[l]==Q[r]) return; for(int i=l;i<=r;i++) ans+=1LL*(r-l)*dis[Q[i]][lev]; int pv=l; LL cdis=dis[Q[l]][lev]; for(int i=l+1;i<=r;i++){ if(seq[Q[i]][lev]!=seq[Q[i-1]][lev]){ ans-=1LL*(i-1-pv)*cdis; f(pv,i-1,lev+1); pv=i; cdis=dis[Q[i]][lev]; }else cdis+=dis[Q[i]][lev]; } ans-=1LL*(r-pv)*cdis; f(pv,r,lev+1); return; } int main(){ scanf("%d %d",&n,&t); for(int i=1;i<n;i++){ int a,b,c; scanf("%d %d %d",&a,&b,&c); V[a].push_back(mp(b,c)); V[b].push_back(mp(a,c)); } memset(seq,-1,sizeof(seq)); memset(dis,0,sizeof(dis)); memset(vis,0,sizeof(vis)); dfs(1,0,0); while(t--){ int sz; scanf("%d",&sz); for(int i=0;i<sz;i++) scanf("%d",&Q[i]); sort(Q,Q+sz,cmp); ans=0; // for(int i=0;i<sz;i++) printf("%d%c",Q[i],i==sz-1?'\n':' '); f(0,sz-1,0); printf("%lld\n",ans); } return 0; }