#include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <cmath> #include <climits> #include <algorithm> #include <iostream> #include <map> #include <queue> #include <set> #include <stack> #include <cassert> #include <vector> #define all(x) x.begin() , x.end() #define fi first #define se second #define pb push_back #define umax( x , y ) x = max( x , (y) ) #define umin( x , y ) x = min( x , (y) ) #define For( i , a ) for(int i=1;i<=a;i++) #define ort (b+s)/2 #define y2 asrwjaelkf #define y1 asseopirwjaelkf using namespace std; inline int read() { int res = 0 ;int neg ; while(true){char ch = getchar();if(ch>='0' && ch<='9' || ch=='-'){if(ch=='-') neg = -1;else neg = 1 , res = ch-'0';break;} } while(true){char ch = getchar();if(ch>='0' && ch<='9') res*=10 , res+=ch-'0';else break;} return res*neg; } const int maxn = 100020; const int MOd = 1e3; typedef long long Lint; typedef long double db; typedef pair<int,int> ii; typedef pair<int,ii> iii; int a, querry; bool used[maxn]; Lint ans[maxn], ar[maxn], ss[maxn]; queue<ii> q; vector<iii> w[maxn]; vector<int> v[maxn], in; int dfss( int n, int back, int sz ) { int ret = 1; in.pb( n ); for(int i=0;i<w[n].size();i++) if( w[n][i].fi != back && !used[w[n][i].fi] ) ret += (w[n][i].se.se = dfss( w[n][i].fi, n, sz )); for(int i=0;i<w[n].size();i++) if( w[n][i].fi == back ) w[n][i].se.se = sz - ret; return ret; } void dfs( int n, int back, int s ) { // printf("asdasd %d\n",n); for(int i=0;i<v[n].size();i++) { //printf("%d --> %d %d\n",v[n][i],ar[v[n][i]],ss[v[n][i]]); ans[v[n][i]] += (Lint)ss[v[n][i]] * s + ar[v[n][i]], q.push( ii( v[n][i], s ) ); } for(int i=0;i<w[n].size();i++) if( w[n][i].fi != back && !used[w[n][i].fi] ) { dfs( w[n][i].fi, n, s + w[n][i].se.fi ); } } void f( int n, int sz ) { in.clear(); dfss( n, 0, sz ); int C = n; for(int i=0;i<in.size();i++) { int c = 0; for(int j=0;j<w[in[i]].size();j++) { //printf("asdsdasdasd %d %d\n",in[i],w[in[i]][j].se.se); if( w[in[i]][j].se.se > sz/2 ) { c = 1; break; } } if( !c ) C = in[i]; } //printf("asdasd %d %d\n",C,n); vector<int> h; used[C] = 1; for(int i=0;i<v[C].size();i++) h.pb( v[C][i] ), ss[v[C][i]] ++; for(int i=0;i<w[C].size();i++) if( !used[w[C][i].fi] ) { dfs( w[C][i].fi, C, w[C][i].se.fi ); while( !q.empty() ) { ii t = q.front(); q.pop(); //printf("asd %d %d\n",t.fi,t.se); h.pb( t.fi ); ar[t.fi] += t.se; ss[t.fi]++; } } //exit(0); for(int i=0;i<h.size();i++) ss[h[i]] = ar[h[i]] = 0; for(int i=0;i<w[C].size();i++) if( !used[w[C][i].fi] ) f( w[C][i].fi, w[C][i].se.se ); } int main() { //freopen("asd.in.c","r",stdin); //freopen("asd.out.c","w",stdout); scanf("%d %d",&a,&querry); for(int i=1,j,k,t;i<a;i++) { scanf("%d %d %d",&j,&k,&t); w[j].pb( iii( k, ii( t, 0 ) ) ); w[k].pb( iii( j, ii( t, 0 ) ) ); } //printf("asdasd\n"); for(int i=1,sz;i<=querry;i++) { scanf("%d",&sz); for(int j=1,k;j<=sz;j++) { scanf("%d",&k); v[k].pb( i ); } } f( 1, a ); for(int i=1;i<=querry;i++) cout << ans[i] << endl; return 0; }