#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;
typedef long long LL;
typedef pair<LL,LL> P;
const LL mod = 1000000007;
P A[MAXN*3];
struct edge{
    int to,next,cost;
}E[MAXN*2];
struct Node{
    int root,dis,subtree;
    Node(int _root=0,int _dis=0,int _subtree=0){
        root=_root,dis=_dis,subtree=_subtree;
    }
};
vector<Node> vec[MAXN];
vector<int> vs;
int head[MAXN],id[MAXN],si,N,que[MAXN],vis[MAXN],sz[MAXN],cnt,dist[MAXN],fa[MAXN];
void add_edge(int u,int v,int w)
{
    E[si].to=v;
    E[si].next=head[u];
    E[si].cost=w;
    head[u]=si++;
}
int get_root(int root,int &tot)
{
    int res=N+1;
    int l=0,r=0;
    fa[root]=0;
    for(que[r++]=root;l<r;l++){
        int v=que[l];
        for(int i=head[v];~i;i=E[i].next){
            int u=E[i].to;
            if(vis[u]||fa[v]==u)continue;
            fa[u]=v;
            que[r++]=u;
        }
    }
    tot=r;
    for(;l;l--){
        int v=que[l-1],m=0;
        sz[v]=1;
        for(int i=head[v];~i;i=E[i].next){
            int u=E[i].to;
            if(fa[v]==u||vis[u])continue;
            sz[v]+=sz[u];
            m=max(m,sz[u]);
        }
        m=max(m,r-sz[v]);
        if(m<res){
            res=m;
            root=v;
        }
    }
    return root;
}
void go(int v,int root,int subtree)
{
    fa[v]=root;
    int l=0,r=0;
    for(que[r++]=v;l<r;l++){
        int u=que[l];
        for(int i=head[u];~i;i=E[i].next){
            if(vis[E[i].to]||fa[u]==E[i].to)continue;
            dist[E[i].to]=dist[u]+E[i].cost;
            fa[E[i].to]=u;
            que[r++]=E[i].to;
        }
    }
    A[subtree]=P(0,0);
    for(int i=0;i<l;i++){
        int u=que[i];
        vec[u].push_back(Node(id[root],dist[u],subtree));
    }
}
void solve(int root)
{
    int tot=0;
    root=get_root(root,tot);
    vis[root]=true;
    id[root]=++cnt;
    vec[root].push_back(Node(id[root],0,-1));
    A[id[root]]=P(0,0);
    for(int i=head[root];~i;i=E[i].next){
        int u=E[i].to;
        if(vis[u])continue;
        dist[u]=E[i].cost;
        ++cnt;
        go(u,root,cnt);
    }
    for(int i=head[root];~i;i=E[i].next){
        int u=E[i].to;
        if(vis[u])continue;
        solve(u);
    }
}
int main()
{
    int q;
    scanf("%d%d",&N,&q);
    memset(head,-1,sizeof head);si=0;cnt=0;
    memset(vec,0,sizeof vec);
    memset(vis,0,sizeof vis);
    for(int i=1,v,u,w;i<N;i++){
        scanf("%d%d%d",&u,&v,&w);
        add_edge(u,v,w);
        add_edge(v,u,w);
    }
    solve(1);
    for(int i=0,K;i<q;i++){
        scanf("%d",&K);
        vs.clear();
        for(int j=0,v;j<K;j++){
            scanf("%d",&v);
            vs.push_back(v);
            for(int k=0;k<vec[v].size();k++){
                Node p=vec[v][k];
                A[p.root].first+=p.dis;
                A[p.root].second++;
                if(~p.subtree){
                    A[p.subtree].first+=p.dis;
                    A[p.subtree].second++;
                }
            }
        }
        LL ans=0;
        for(int j=0;j<K;j++){
            int v=vs[j];
            for(int k=0;k<vec[v].size();k++){
                Node p=vec[v][k];
                ans+=A[p.root].first+p.dis*A[p.root].second;
                if(~p.subtree){
                    ans-=A[p.subtree].first+p.dis*A[p.subtree].second;
                }
            }
        }
        cout<<ans/2<<endl;
        for(int j=0;j<K;j++){
            int v=vs[j];
            for(int k=0;k<vec[v].size();k++){
                Node p=vec[v][k];
                A[p.root]=P(0,0);
                if(~p.subtree){
                    A[p.subtree]=P(0,0);
                }
            }
        }
    }
   // printf("__end\n");
    return 0;
}