#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;
}