#include <bits/stdc++.h> using namespace std; typedef long long ll; #define pii pair<int,int> #define pll pair<ll,ll> #define pdd pair<double,double> #define X first #define Y second #define REP(i,a) for(int i=0;i<a;++i) #define REPP(i,a,b) for(int i=a;i<b;++i) #define FILL(a,x) memset(a,x,sizeof(a)) #define foreach( gg,itit ) for( typeof(gg.begin()) itit=gg.begin();itit!=gg.end();itit++ ) #define mp make_pair #define pb push_back #define sz(a) int((a).size()) #define all(a) a.begin(), a.end() #define debug(ccc) cout << #ccc << " = " << ccc << endl; #define present(c,x) ((c).find(x) != (c).end()) const double eps = 1e-8; #define EQ(a,b) (fabs((a)-(b))<eps) inline int max(int a,int b){return a<b?b:a;} inline int min(int a,int b){return a>b?b:a;} inline ll max(ll a,ll b){return a<b?b:a;} inline ll min(ll a,ll b){return a>b?b:a;} const int mod = 1e9+7; const int N = 1e5+10; const ll inf = 1e18; ll fl(ll x, ll y) { if (x >= 0) return x / y; return x / y - (x % y ? 1 : 0); } ll cl(ll x, ll y) { if (x >= 0) return (x + y - 1) / y; return x / y; } ll power(ll a,ll n){ if(n==0){ return 1; } ll b = power(a,n/2); b = b*b%mod; if(n%2) b= b*a%mod; return b; } vector <pii> G[N],G1[N]; vector <int> S[N]; int tin[N],tout[N],depth[N],timer=1,T[2*N],parent[N],L[20][N],global; ll dis[N],st; vector <int> A; ll ans=0; int LCA(int a,int b){ if(depth[a]>depth[b]) swap(a,b); int dif = depth[b]-depth[a]; int c=0; while(dif>0){ if(dif&1){ b = L[c][b]; } c++;dif/=2; } if(a==b) return a; for(int i=19;i>=0;i--){ if(L[i][a]!=L[i][b]){ a = L[i][a];b= L[i][b]; } } return L[0][a]; } void dfs(int i,int par,int d){ depth[i]=d; parent[i]=par;L[0][i]=par; tin[i]=timer++; T[tin[i]]=i; REP(j,G1[i].size()){ int to = G1[i][j].X; if(to==par){ dis[i]=dis[par]+G1[i][j].Y;continue;} G[i].pb(G1[i][j]); dfs(to,i,d+1); S[i].pb(tin[to]); } tout[i]=timer++; T[tout[i]]= i; } ll f(int a,int b){ // printf("%d %d %d %d\n",a,b,T[A[a]],T[A[b]]); if(a>b) return 0; ll l = b-a+1; if(a==b){ //printf("%d\n",dis[T[A[a]]]); return dis[T[A[a]]]; } int p = LCA(T[A[a]],T[A[b]]); //printf("p = %d\n",p); ll sum=0,c=0; while(A[a]==tin[p]){ c++;a++; } //printf("%d %d %d %d\n",a,b,T[A[a]],T[A[b]]); while(a<=b){ int in = upper_bound(all(S[p]),A[a]) - S[p].begin(); in--; int in1 = upper_bound(all(A),tout[G[p][in].X])-A.begin(); // printf("h %d %d %d %d\n",in,in1-a,tout[G[p][in].X],G[p][in].X); ll x = f(a,in1-1); x-=dis[p]*(in1-a); // printf("x = %lld\n",x); ans+=x*c+(in1-a)*sum; sum+=x; c+=in1-a; a = in1; } // st+=B[g].size(); // printf("%lld\n",st); // printf("%lld %lld\n",ans,c); return sum+ l*dis[p]; } int main(){ int n,t; scanf("%d %d",&n,&t); REP(i,n-1){ int u,v,c; scanf("%d %d %d",&u,&v,&c); //u = i+1;v=i+2;c=1; G1[u].pb(mp(v,c)); G1[v].pb(mp(u,c)); } dfs(1,0,1); REPP(j,1,20){ REPP(i,1,n+1) L[j][i] = L[j-1][L[j-1][i]]; } // printf("HI\n"); REP(i,t){ int k; scanf("%d",&k); A.clear(); REP(j,k){ int u;scanf("%d",&u); //u = 1; A.pb(tin[u]); // printf("%d\n",tin[u]); } sort(all(A)); ans=0; f(0,A.size()-1); printf("%lld\n",ans); } return 0; }