#include "bits/stdc++.h"
using namespace std;
inline int scan(){
    int x = 0;
    char c = getchar_unlocked();
    while(c < '0' || c > '9'){
        c = getchar_unlocked();
    }
    while(c >= '0' && c <= '9'){
        x = (x << 3) + (x << 1) + c - '0';
        c = getchar_unlocked();
    }
    return x;
}
const int N = 1e5 + 5;
const int LN = 20;
int n , t;
int a , b , c;
int k;
long long ans;
static vector < pair < int , int > > v[N];
static int dist[N];
static int depth[N];
static int dp[LN][N << 1];
static int arr[N];
static int mark[N];
static int logtable[N << 1];
static int euler[N << 1];
static int start[N];
int timer;
inline void pre(){
    logtable[1] = 0;
    for(int i = 2 ; i <= timer ; ++i){
        logtable[i] = logtable[i >> 1] + 1;
    }
    for(int i = 1 ; i <= timer ; ++i){
        dp[0][i] = euler[i];
    }
    for(int i = 1 ; i < LN ; ++i){
        for(int j = 1 ; j + (1 << i) - 1 <= timer ; ++j){
            int x = depth[dp[i - 1][j]];
            int y = depth[dp[i - 1][j + (1 << (i - 1))]];
            dp[i][j] = (x <= y) ? dp[i - 1][j] : dp[i - 1][j + (1 << (i - 1))];
        }
    }
}
void dfs1(int node , int parent){
    euler[++timer] = node;
    start[node] = timer;
    for(auto it : v[node]){
        if(it.first != parent){
            dist[it.first] = dist[node] + it.second;
            depth[it.first] = depth[node] + 1;
            dfs1(it.first , node);
            euler[++timer] = node;
        }
    }
}
inline int rmq(int l , int r) {
    int k = logtable[r - l + 1];
    return depth[dp[k][l]] <= depth[dp[k][r - (1 << k) + 1]] ? dp[k][l] : dp[k][r - (1 << k) + 1];
}
inline int lca(int a, int b) {
    return rmq(min(start[a] , start[b]), max(start[a] , start[b]));
}
long long solve(){
    for(int i = n ; i >= 1 ; --i){
        for(auto it : v[i]){
            if(it.first > i){
                ans += 1LL * mark[it.first] * (k - mark[it.first]) * it.second;
                mark[i] += mark[it.first];
            }
        }
    }
    return ans;
}
void out(){
    if(ans < 10){
        putchar_unlocked('0' + ans);
        return;
    }
    int temp = ans % 10;
    ans /= 10;
    out();
    putchar_unlocked('0' + temp);
}
int main(){
    timer = 0;
    n = scan() , t = scan();
    for(int i = 1 ; i < n ; ++i){
        a = scan() , b = scan() , c = scan();
        v[a].emplace_back(make_pair(b , c));
        v[b].emplace_back(make_pair(a , c));
    }
    dist[1] = 0;
    depth[1] = 0;
    dfs1(1 , 0);
    pre();
    for(int ii = 1 ; ii <= t ; ++ii){
        k = scan();
        ans = 0;
        for(int i = 1 ; i <= k ; ++i){
            arr[i] = scan();
        }
        if(k <= 320){
            for(int i = 1 ; i <= k ; ++i){
                for(int j = 1 ; j < i ; ++j){
                    ans += dist[arr[i]] + dist[arr[j]] - (dist[lca(arr[i] , arr[j])] << 1);
                }
            }
        }
        else{
            memset(mark , 0 , sizeof(mark));
            for(int i = 1 ; i <= k ; ++i){
                ++mark[arr[i]];
            }
            ans = solve();
        }
        out();
        putchar_unlocked('\n');
    }
}