//Solution by Zhusupov Nurlan
#include <iostream>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <set>
#include <vector>
#include <map>
#include <string>
#include <stack>
#include <queue>
#include <ctime>

using namespace std;

typedef long long LL;
typedef map<string , int> MSI;
typedef vector<int> VI;
typedef pair<int, int> PII;

#define pb(x) push_back(x)
#define sqr(x) ((x) * (x))
#define F first
#define S second
#define SZ(t) ((int) t.size())
#define len(t) ((int) t.length())
#define base LL(1e9 + 7)
#define fname ""
#define sz (1000 * 100 + 10)
#define EPS (1e-8)
#define INF ((int)1e9 + 9)
#define write(xx) printf("%d" , xx);
#define readln(xx) getline(cin , xx)
#define read(xx) scanf("%d" , &xx)
#define mp make_pair

const double PI  = acos(-1.0);

int in[sz], t, T, cnt[sz], out[sz], last, n, ww[sz], Ti, v, u, c, p[21][sz], s[21][sz], st[sz * 20], q[sz * 10], k;
VI a[sz], b[sz];
LL res, ans;


bool upper(int v, int u)
{
    return in[v] <= in[u] && out[u] <= out[v];
}
int lcm(int v, int u)
{
    if (upper(v, u))
        return v;
    for (int i = 20; i >= 0; i--)
        while (!upper(p[i][v], u))
            v = p[i][v];
    if (v == 1)
        return v;
    return p[0][v];
}

bool cmp(int v, int u)
{
    return in[v] < in[u];
}

LL get(int v, int u)
{
    if (v == u)
        return 0;
    res = 0;
    int V = v;
    for (int i = 20; i >= 0; i--)
    {
        while (!upper(p[i][v], u))
        {
            res += s[i][v];
            v = p[i][v];
        }
    }
    return (res + s[0][v]) * cnt[V] * (k - cnt[V]);
}

void dfs(int v, int pr = 0)
{
    in[v] = ++t;

    p[0][v] = pr;

    for (int i = 1; i <= 20; i++)
    {
        p[i][v] = p[i - 1][p[i - 1][v]];
        s[i][v] = s[i - 1][v] + s[i - 1][p[i - 1][v]];    
    }

    for (int i = 0; i < a[v].size(); i++)
    {
        if (a[v][i] != pr)
        {
            s[0][a[v][i]] = b[v][i];
            dfs(a[v][i], v);
        }
    }

    out[v] = ++t;
}

int main()
{
    //freopen("in", "r", stdin);
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> T;
    for (int i = 1; i < n; i++)
    {
        cin >> v >> u >> c;
        a[v].pb(u);
        a[u].pb(v);
        b[v].pb(c);
        b[u].pb(c);
    }
    out[0] = INF;
    dfs(1);
    while (T--)
    {
        cin >> k;
        for (int i = 1; i <= k; i++)
            cin >> q[i];

        Ti++;
        sort(q + 1, q + 1 + k, cmp);
        c = 1;
        st[c] = 1;
        cnt[1] = 0;
        ww[1] = Ti;
        ans = 0;
        for (int i = 1; i <= k; i++)
        {
            last = lcm(st[c], q[i]);
            while (!upper(st[c], q[i]))
            {
                if (last != st[c - 1] && upper(st[c - 1], q[i]))
                {
                    if (ww[last] != Ti)
                        ww[last] = Ti, cnt[last] = 0;
                    cnt[last] = cnt[st[c]];
                    ans += get(st[c], last);
                }
                else
                {
                    cnt[st[c - 1]] += cnt[st[c]];
                    ans += get(st[c], st[c - 1]);
                }
                c--;
            }
            if (last != st[c])
                st[++c] = last;
            if (st[c] != q[i])
                st[++c] = q[i];
            if (ww[q[i]] != Ti)
                ww[q[i]] = Ti, cnt[q[i]] = 0;
            cnt[q[i]]++;
        }
        while (c > 1)
        {
            cnt[st[c - 1]] += cnt[st[c]];
            ans += get(st[c], st[c - 1]);
            c--;
        }
    
        cout << ans << "\n";
    }
}