#include <iostream> #include <assert.h> #include <stdlib.h> #include <time.h> #include <stdio.h> #include <vector> #include <set> #include <map> #include <queue> #include <stack> #include <string> #include <string.h> #include <cmath> #include <memory.h> #include <algorithm> using namespace std; typedef long long ll; const int N=100001; int n,dp[17][N],rev[N],s[N],e[N],d[N],ud[N],T[N],dfs=-1,v[N*10],org[N*10],need[N],q[3*N],last; vector<vector<pair<int,int> > > g; void DFS(int u,int p){ dp[0][u]=p; s[u]=++dfs; rev[dfs]=u; for(int i=0;i<g[u].size();++i) if(g[u][i].first!=p){ d[g[u][i].first]=d[u]+g[u][i].second; ud[g[u][i].first]=ud[u]+1; T[g[u][i].first]=u; DFS(g[u][i].first,u); } e[u]=dfs; } int LCA(int u,int v){ if(ud[u]<ud[v]) swap(u,v); int l=0; while((1<<l)<=ud[u]) ++l; --l; for(int i=l;i>=0;--i) if(ud[u]-(1<<i)>=ud[v]) u=dp[i][u]; if(u==v) return u; for(int i=l;i>=0;--i) if(dp[i][u]!=dp[i][v]){ u=dp[i][u]; v=dp[i][v]; } return T[u]; } ll res; int total; vector<int> w; int calc(int u,int p){ int down=need[u]; w.pop_back(); while(!w.empty() && w.back()<=e[rev[u]]) down+=calc(w.back(),u); if(p!=-1) res+=(ll)down*(total-down)*(ll)(d[rev[u]]-d[rev[p]]); return down; } int main() { int t; scanf("%d%d",&n,&t); g.resize(n); for(int i=1,a,b,c;i<n;++i){ scanf("%d%d%d",&a,&b,&c); --a;--b; g[a].push_back(make_pair(b,c)); swap(a,b); g[a].push_back(make_pair(b,c)); } DFS(n-1,-1); for(int k=1;(1<<k)<n;++k) for(int i=0;i<n;++i) if(dp[k-1][i]!=-1) dp[k][i]=dp[k-1][dp[k-1][i]]; int k; w.reserve(n); while(t--){ scanf("%d",&k); int z=k; total=k; for(int i=0;i<k;++i){ scanf("%d",&v[i]); --v[i]; org[i]=v[i]; v[i]=s[v[i]]; } sort(v,v+k); k=unique(v,v+k)-v; for(int i=0;i<k;++i) v[i]=rev[v[i]]; q[0]=v[0]; last=1; for(int i=1;i<k;++i){ q[last]=LCA(q[last-1],v[i]); q[++last]=v[i]; ++last; } for(int i=0;i<last;++i) q[i]=s[q[i]]; sort(q,q+last); k=unique(q,q+last)-q; for(int i=0;i<z;++i) ++need[s[org[i]]]; res=0; w.clear(); w.assign(q,q+k); reverse(w.begin(),w.end()); calc(w.back(),-1); for(int i=0;i<z;++i) need[s[org[i]]]=0; printf("%lld\n",res); } return 0; }