#include<bits/stdc++.h> #define MAXN 100005 using namespace std; typedef long long LL; typedef pair<LL,LL> P; const LL mod = 1000000007; P A[MAXN*3]; struct edge{ int to,next,cost; }E[MAXN*2]; struct Node{ int root,dis,subtree; Node(int _root=0,int _dis=0,int _subtree=0){ root=_root,dis=_dis,subtree=_subtree; } }; vector<Node> vec[MAXN]; vector<int> vs; int head[MAXN],id[MAXN],si,N,que[MAXN],vis[MAXN],sz[MAXN],cnt,dist[MAXN],fa[MAXN]; void add_edge(int u,int v,int w) { E[si].to=v; E[si].next=head[u]; E[si].cost=w; head[u]=si++; } int get_root(int root,int &tot) { int res=N+1; int l=0,r=0; fa[root]=0; for(que[r++]=root;l<r;l++){ int v=que[l]; for(int i=head[v];~i;i=E[i].next){ int u=E[i].to; if(vis[u]||fa[v]==u)continue; fa[u]=v; que[r++]=u; } } tot=r; for(;l;l--){ int v=que[l-1],m=0; sz[v]=1; for(int i=head[v];~i;i=E[i].next){ int u=E[i].to; if(fa[v]==u||vis[u])continue; sz[v]+=sz[u]; m=max(m,sz[u]); } m=max(m,r-sz[v]); if(m<res){ res=m; root=v; } } return root; } void go(int v,int root,int subtree) { fa[v]=root; int l=0,r=0; for(que[r++]=v;l<r;l++){ int u=que[l]; for(int i=head[u];~i;i=E[i].next){ if(vis[E[i].to]||fa[u]==E[i].to)continue; dist[E[i].to]=dist[u]+E[i].cost; fa[E[i].to]=u; que[r++]=E[i].to; } } A[subtree]=P(0,0); for(int i=0;i<l;i++){ int u=que[i]; vec[u].push_back(Node(id[root],dist[u],subtree)); } } void solve(int root) { int tot=0; root=get_root(root,tot); vis[root]=true; id[root]=++cnt; vec[root].push_back(Node(id[root],0,-1)); A[id[root]]=P(0,0); for(int i=head[root];~i;i=E[i].next){ int u=E[i].to; if(vis[u])continue; dist[u]=E[i].cost; ++cnt; go(u,root,cnt); } for(int i=head[root];~i;i=E[i].next){ int u=E[i].to; if(vis[u])continue; solve(u); } } int main() { int q; scanf("%d%d",&N,&q); memset(head,-1,sizeof head);si=0;cnt=0; memset(vec,0,sizeof vec); memset(vis,0,sizeof vis); for(int i=1,v,u,w;i<N;i++){ scanf("%d%d%d",&u,&v,&w); add_edge(u,v,w); add_edge(v,u,w); } solve(1); for(int i=0,K;i<q;i++){ scanf("%d",&K); vs.clear(); for(int j=0,v;j<K;j++){ scanf("%d",&v); vs.push_back(v); for(int k=0;k<vec[v].size();k++){ Node p=vec[v][k]; A[p.root].first+=p.dis; A[p.root].second++; if(~p.subtree){ A[p.subtree].first+=p.dis; A[p.subtree].second++; } } } LL ans=0; for(int j=0;j<K;j++){ int v=vs[j]; for(int k=0;k<vec[v].size();k++){ Node p=vec[v][k]; ans+=A[p.root].first+p.dis*A[p.root].second; if(~p.subtree){ ans-=A[p.subtree].first+p.dis*A[p.subtree].second; } } } cout<<ans/2<<endl; for(int j=0;j<K;j++){ int v=vs[j]; for(int k=0;k<vec[v].size();k++){ Node p=vec[v][k]; A[p.root]=P(0,0); if(~p.subtree){ A[p.subtree]=P(0,0); } } } } // printf("__end\n"); return 0; }