//Pranet Verma
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
const int N=100010;
vector<pii> g[N];
int sz[N],heavy[N],chain[N],freq[N],pos[N],pool,dep[N],base,NN,tree[N<<2],pa[N];
long long sum[N];
void dfs(int u,int p,int w)
{
    sz[u]=1;
    sum[u]=sum[p]+w;
    dep[u]=dep[p]+1;
    pa[u]=p;
    for(int i=0;i<(int)g[u].size();++i)
    {
        int v=g[u][i].first;
        int _w=g[u][i].second;
        if(v==p)
            continue;
        dfs(v,u,_w);
        sz[u]+=sz[v];
        if(sz[v]>sz[heavy[u]])
            heavy[u]=v;
    }
}
void hld(int u,int p,int id)
{
    pos[u]=++pool;
    chain[u]=id;
    if(heavy[u])
        hld(heavy[u],u,id);

    for(int i=0;i<(int)g[u].size();++i)
    {
        int v=g[u][i].first;
        if(v==p || v==heavy[u])
            continue;
        hld(v,u,v);
    }
}
int merge(int u,int v)
{
    return dep[u]>dep[v]?u:v;
}
void mu(int u)
{
    while(u)
    {
        int p=(u-1)/2;
        if(u&1)
            tree[p]=merge(tree[u],tree[u+1]);
        else
            tree[p]=merge(tree[u],tree[u-1]);
        u=p;
    }
}
int qst(int u,int l,int r,int x,int y)
{
    if(x>r || y<l)
        return 0;
    if(x<=l && r<=y)
        return tree[u];
    return merge(qst(2*u+1,l,(l+r)/2,x,y),qst(2*u+2,(l+r)/2+1,r,x,y));
}
#define ppi pair<pii,int>
priority_queue<ppi> Q;

int getNext(int u)
{
    tree[base+pos[u]]=0;
    mu(base+pos[u]);

    int v=qst(0,0,base,pos[chain[u]],pos[u]);

    if(v==0)
        v=pa[chain[u]];
    if(v==0)
        return 0;
    if(!tree[base+pos[v]])
    {
        tree[base+pos[v]]=v;
        mu(base+pos[v]);
        Q.push(make_pair(make_pair(dep[chain[v]],dep[v]),v));
    }
    return v;
}
int main()
{
    int n,q;
    scanf("%d%d",&n,&q);
    NN=ceil(log2(n));
    base=(1<<NN)-1;
    for(int i=1;i<n;++i)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        g[u].push_back(make_pair(v,w));
        g[v].push_back(make_pair(u,w));
    }
    dfs(1,0,0);
    hld(1,0,1);
    while(q--)
    {
        long long ans=0;
        int k;
        scanf("%d",&k);
        for(int i=0;i<k;++i)
        {
            int u;
            scanf("%d",&u);
            if(!freq[u])
            {
                Q.push(make_pair(make_pair(dep[chain[u]],dep[u]),u));
                tree[base+pos[u]]=u;
                mu(base+pos[u]);
            }
            freq[u]++;
        }
        while(!Q.empty())
        {
            int u=Q.top().second;
            Q.pop();
            int v=getNext(u);
            ans+=(long long)(k-freq[u])*freq[u]*(sum[u]-sum[v]);
            freq[v]+=freq[u];
            freq[u]=0;       
        }
        printf("%lld\n",ans);
        freq[0]=0;
    }
}