#include<bits/stdc++.h> using namespace std; #define ll long long #define cin(n) scanf("%d",&n) #define pb push_back #define mp make_pair vector<pair<int,int> >adj[100008],adj2[100008]; int par[100008],lev[100008]; int P[100008][21]; int st[100008],en[100008],rev[100008]; ll dist[100008]; int ct; void dfs(int node,int p,int l) { st[node]=++ct; rev[ct]=node; par[node]=p; lev[node]=l; for(int i=0;i<adj[node].size();i++) { int v=adj[node][i].first; ll cst=adj[node][i].second; if(v==p) continue; dist[v]=dist[node]+cst; dfs(v,node,l+1); } en[node]=ct; return; } void pre(int N) { int i, j; for(i=0;i<=N;i++) { P[i][0]=par[i]; } for(j=1;j<=18;j++) { for(i=1;i<=N;i++) { if(P[i][j-1]>0) { P[i][j] = P[P[i][j - 1]][j - 1]; //dp[i][j]=dp[i][j-1]+dp[P[i][j-1]][j-1]; } } } } int lca(int p, int q) { int tmp, log, i; if (lev[p]<lev[q]) tmp = p, p = q, q = tmp; for (log = 1; (1<<log)<=lev[p]; log++); log--; for (i = log;i>=0;i--) if (lev[p]-(1<<i)>=lev[q]) p = P[p][i]; if(p == q) return p; for (i = log; i >= 0; i--) if (P[p][i]>0 && P[p][i]!=P[q][i]) p = P[p][i], q = P[q][i]; return par[p]; } int dis(int x,int y){ return dist[x]+dist[y]-2*dist[lca(x,y)]; } ll dp[100008]; vector<int>q,q2; int sz2; int vis[100008]; void chutia_ans(int u,int p,ll c){ if(u!=1){ int l=st[u],r=en[u]; int subtree_sz=upper_bound(q2.begin(),q2.end(),r)-lower_bound(q2.begin(),q2.end(),l); dp[u]=dp[p]+(sz2-2*subtree_sz)*c; //cout<<" "<<sz2<<"\n"; //cout<<u<<" "<<dp[u]<<"\n"; } for(int i=0;i<adj2[u].size();i++){ int v=adj2[u][i].first; //cout<<"node "<<v<<"\n"; if(v==p) continue; ll cost=adj2[u][i].second; chutia_ans(v,u,cost); } return; } int main() { int t,m,n,i,j,k,l; cin(n); cin(m); for(i=0;i<=n;i++) adj[i].clear(),adj2[i].clear(),vis[i]=0; for(i=1;i<=n-1;i++){ cin(j);cin(k); cin(l); adj[j].pb(mp(k,l)); adj[k].pb(mp(j,l)); } ct=0; memset(P,-1,sizeof(P)); dfs(1,0,0); pre(n); while(m--) { int sz; cin(sz); q.clear();q2.clear(); set<int>s; for(i=1;i<=sz;i++){ cin(j); q2.pb(j);vis[j]=1; j=st[j]; q.pb(j);s.insert(j); } //adding extra node q.pb(1);q2.pb(1); vis[1]=1; ll initial_cost=0; for(i=0;i<q2.size();i++){ initial_cost+=dis(1,q2[i]); } //creating a copy for(i=0;i<q2.size();i++) q2[i]=st[q2[i]]; sort(q2.begin(),q2.end()); sort(q.begin(),q.end()); int qs=q.size(); for(i=1;i<qs;i++){ int x=lca(rev[q[i]],rev[q[i-1]]); if(!vis[x]) vis[x]=1,q.pb(st[x]),s.insert(st[x]); } sort(q.begin(),q.end()); sz2=q2.size(); //create reduced tree :) for(i=q.size()-1;i>=0;i--){ vector<set<int>::iterator>v; set<int>::iterator it; int x=rev[q[i]]; int l=st[x],r=en[x]; it=s.lower_bound(l+1); while(it!=s.end()&&(*it)<=r){ adj2[x].pb(mp(rev[*it],dis(x,rev[*it]))); v.pb(it); it++; } for(j=0;j<v.size();j++) s.erase(v[j]); } dp[1]=initial_cost; chutia_ans(1,0,0); ll ans=0; for(i=1;i<q2.size();i++) ans+=dp[rev[q2[i]]]; ans-=initial_cost; printf("%lld\n",ans/2); //reset for(i=0;i<q.size();i++) adj2[rev[q[i]]].clear(),adj2[q[i]].clear(),vis[q[i]]=0,vis[rev[q[i]]]=0; adj2[1].clear(); vis[1]=0; } return 0; }