#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define foru(i,a,b) for(int i = (a), _b = (b); i <= _b; ++i)
#define ford(i,a,b) for(int i = (a), _b = (b); i >= _b; --i)
const int N = 2E5+10, LEN = 750;
typedef pair<int, int> pii;
typedef long long ll;
int n, din[N], dout[N], p[N], dep[N], rmq[N*2][20], m, pos[N*2], e[N*2], lg[N*2];
vector<pii> a[N];
ll f[N], ans;
int nq, cnt[N], x[N], sum[N], now, ptr, node;
vector<pii> q[N];

void enter() {
    scanf("%d %d", &n, &nq);
    foru(i,1,n-1) {
        int u, v, c;
        scanf("%d %d %d", &u, &v, &c);
        a[u].push_back(pii(v,c));
        a[v].push_back(pii(u,c));
    }

    foru(i,1,nq) {
        int k;
        scanf("%d", &k);
        foru(j,1,k) {
            scanf("%d", x+j);
            ++cnt[x[j]];
        }
        foru(j,1,k) if (cnt[x[j]]) {
            q[i].push_back(pii(x[j], cnt[x[j]]));
            sum[i] += cnt[x[j]];
            cnt[x[j]] = 0;
        }
    }
}

void dfs(int u) {
    din[u] = ++m; pos[u] = m; e[m] = u;
    foru(i,0,a[u].size()-1) {
        int v = a[u][i].first;
        if (p[v] == 0) {
            p[v] = u;
            f[v] = f[u] +a[u][i].second;
            dep[v] = dep[u] + 1;
            dfs(v);
            e[++m] = u;
        }
    }
    dout[u] = m;
}

void init() {
    p[1] = -1; m = 0; f[1] = 0;
    dfs(1);
    lg[0] = 0;
    foru(i,1,m) lg[i] = lg[i-1] + (1 << (lg[i-1]+1) <= i);
    foru(i,1,m) rmq[i][0] = e[i];
    foru(j,1,lg[m]) foru(i,1<<j,m) {
        int x = rmq[i][j-1], y = rmq[i - (1 << (j-1))][j-1];
        rmq[i][j] = (dep[x] < dep[y])? x: y;
    }
}

int lca(int u, int v) {
    int i = pos[u], j = pos[v];
    if (i > j) swap(i, j);
    int k = lg[j-i+1];
    int x = rmq[j][k], y = rmq[i+(1<<k)-1][k];
    return (dep[x] < dep[y])? x: y;
}

bool cmp(const pii &a, const pii &b) { return din[a.first] < din[b.first]; }

void dfs2(int u) {
    if (u == node) {
        cnt[u] = q[now][ptr].second;
        ++ptr;  if (ptr == q[now].size()) return;
        node = q[now][ptr].first;
    } else cnt[u] = 0;
    foru(i,0,a[u].size()-1) {
        int v = a[u][i].first;
        if (p[v] == u && din[v] <= din[node] && dout[node] <= dout[v]) {
            dfs2(v);
            cnt[u] += cnt[v];
            ans += ll(cnt[v]) * ll(sum[now] - cnt[v]) * a[u][i].second;
            if (ptr == q[now].size()) return;
        }
    }
}

void solve() {
    foru(i,1,nq) if (q[i].size() >= LEN) sort(q[i].begin(), q[i].end(), cmp);
    foru(z,1,nq) if (q[z].size() < LEN) {
        ll res = 0;
        foru(i,0,q[z].size()-2) foru(j,i+1,q[z].size()-1) {
            int x = q[z][i].first, y = q[z][j].first, r = lca(x,y);
            res += (f[x] + f[y] - f[r] * 2) * ll(q[z][i].second) * q[z][j].second;
        }
        printf("%lld\n", res);
    }
    else
    {
        ans = 0; now = z; ptr = 0; node = q[now][ptr].first;
        dfs2(1);
        printf("%lld\n", ans);
    }
}

int main() {
    //freopen("test.inp", "r", stdin);
    enter();
    init();
    //foru(i,1,m) cout << e[i] << " \n"[i==m];
    //foru(i,1,m) cout << dep[e[i]] << " \n"[i==m];
    //cout << pos[4] << " " << pos[7] << "\n";
    solve();
}