#include <bits/stdc++.h>
using namespace std;

int n;
int q;

int p1, p2, p3;
vector < pair <int,int> > graf[100007];

int l;

int pre[100007];
int post[100007];
int odl[100007];

int co[1000007];

int n1;
pair <int,int> drzewo[1000007];

long long tak[100007];
long long suma[100007];

vector <int> wek;
vector <int> wek2;

int u, w;
long long wyn;

void dfs(int v, int oj, int o)
{
    odl[v]=o;
    l++;
    pre[v]=l;
    post[v]=l;
    co[l]=v;
    for (int i=0; i<graf[v].size(); i++)
    {
        if (graf[v][i].first==oj)
        continue;
        dfs(graf[v][i].first, v, o+graf[v][i].second);
        l++;
        post[v]=l;
        co[l]=v;
    }
}

int potenga(int v)
{
    for (int i=1; 1; i<<=1)
    {
        if (i>=v)
        {
            return i;
        }
    }
}

void start(int v, int a, int b)
{
    if (a==b)
    {
        drzewo[v]=make_pair(odl[co[a]], co[a]);
        return;
    }
    start((v<<1), a, (a+b)>>1);
    start((v<<1)^1, (a+b+2)>>1, b);
    drzewo[v]=min(drzewo[(v<<1)], drzewo[(v<<1)^1]);
}

pair <int,int> czyt(int v, int a, int b, int graa, int grab)
{
    if (a>=graa && b<=grab)
    {
        return drzewo[v];
    }
    if (a>grab || b<graa)
    {
        return make_pair(1000000000,0);
    }
    return min( czyt((v<<1), a, (a+b)>>1, graa, grab) , czyt((v<<1)^1, (a+b+2)>>1, b, graa, grab) );
}

int dajlca(int a, int b)
{
    return czyt(1, 1, n1, min(pre[a], pre[b]), max(post[a], post[b])).second;
}

bool mniej(int a, int b)
{
    return post[a]<post[b];
}

int main()
{
    odl[0]=1000000007;
    scanf("%d%d", &n, &q);
    for (int i=1; i<n; i++)
    {
        scanf("%d%d%d", &p1, &p2, &p3);
        graf[p1].push_back(make_pair(p2, p3));
        graf[p2].push_back(make_pair(p1, p3));
    }
    dfs(1, 0, 0);
    n1=potenga(l);
    start(1, 1, n1);
    while(q--)
    {
        scanf("%d", &p1);
        p3=p1;
        wek.clear();
        wek2.clear();
        wyn=0;
        while(p1--)
        {
            scanf("%d", &p2);
            wek.push_back(p2);
        }
        sort(wek.begin(), wek.end(), mniej);
        for (int i=wek.size()-1; i; i--)
        {
            p1=dajlca(wek[i], wek[i-1]);
            wek.push_back(p1);
        }
        for (int i=0; i<wek.size(); i++)
        {
            tak[wek[i]]=0;
            suma[wek[i]]=0;
        }
        for (int i=0; i<p3; i++)
        {
            tak[wek[i]]++;
        }
        sort(wek.begin(), wek.end(), mniej);
        for (int i=0; i<wek.size(); i++)
        {
            if (i && wek[i]==wek[i-1])
            continue;
            u=wek[i];
            //printf("  %d\n", u);
            while(!wek2.empty() && pre[u]<=pre[wek2.back()])
            {
                w=wek2.back();
                wek2.pop_back();
                wyn+=tak[u]*(tak[w]*(odl[w]-odl[u])+suma[w])+tak[w]*suma[u];
                suma[u]+=suma[w]+tak[w]*(odl[w]-odl[u]);
                tak[u]+=tak[w];
            }
            wek2.push_back(u);
            //printf(" %lld %lld %lld", wyn, tak[i], suma[i]);
        }
        printf("%lld\n", wyn);
    }
    return 0;
}