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

#define ll long long
#define cin(n) scanf("%d",&n)
#define pb push_back
#define mp make_pair


vector<pair<int,int> >adj[100008],adj2[100008];
int par[100008],lev[100008];
int P[100008][21];
int st[100008],en[100008],rev[100008];
ll dist[100008];
int ct;

void dfs(int node,int p,int l)
{
    st[node]=++ct;
    rev[ct]=node;
    par[node]=p;
    lev[node]=l;
    for(int i=0;i<adj[node].size();i++)
    {
        int v=adj[node][i].first;
        ll cst=adj[node][i].second;
        if(v==p)
            continue;
        dist[v]=dist[node]+cst;
        dfs(v,node,l+1);
    }
    en[node]=ct;
    return;
}    
void pre(int N)
{
      int i, j;
   
      
      for(i=0;i<=N;i++)
      {
          P[i][0]=par[i];  
      }
      
    for(j=1;j<=18;j++)
     {
          for(i=1;i<=N;i++)
          {
              if(P[i][j-1]>0)
              {
                    P[i][j] = P[P[i][j - 1]][j - 1];
                    //dp[i][j]=dp[i][j-1]+dp[P[i][j-1]][j-1];  
              }
          }
      }
}

int lca(int p, int q)
{
      int tmp, log, i;
   
      if (lev[p]<lev[q])
          tmp = p, p = q, q = tmp;
      
     for (log = 1; (1<<log)<=lev[p]; log++);
        log--;
   
      for (i = log;i>=0;i--)
          if (lev[p]-(1<<i)>=lev[q])
              p = P[p][i];
   
      if(p == q)
          return p;
   
     for (i = log; i >= 0; i--)
          if (P[p][i]>0 && P[p][i]!=P[q][i])
              p = P[p][i], q = P[q][i];
   
      return par[p];
}

int dis(int x,int y){
    return dist[x]+dist[y]-2*dist[lca(x,y)];
}

ll dp[100008];
vector<int>q,q2;
int sz2;
int vis[100008];

void chutia_ans(int u,int p,ll c){
    
    if(u!=1){
        int l=st[u],r=en[u];
        int subtree_sz=upper_bound(q2.begin(),q2.end(),r)-lower_bound(q2.begin(),q2.end(),l);
        dp[u]=dp[p]+(sz2-2*subtree_sz)*c;
        //cout<<" "<<sz2<<"\n";
        //cout<<u<<" "<<dp[u]<<"\n";
    }

    for(int i=0;i<adj2[u].size();i++){
        int v=adj2[u][i].first;
        //cout<<"node "<<v<<"\n";
        if(v==p)
            continue;
        ll cost=adj2[u][i].second;
        chutia_ans(v,u,cost);
    }
    return;
}

int main()
{
    int t,m,n,i,j,k,l;

    cin(n);
    cin(m);
    
    for(i=0;i<=n;i++)
        adj[i].clear(),adj2[i].clear(),vis[i]=0;
    
    for(i=1;i<=n-1;i++){
        cin(j);cin(k);
        cin(l);
        adj[j].pb(mp(k,l));
        adj[k].pb(mp(j,l));
    }
    ct=0;
    memset(P,-1,sizeof(P));
    dfs(1,0,0);
    pre(n);
    
    while(m--)
    {
        int sz;
        cin(sz);
        
        q.clear();q2.clear();
        set<int>s;
        
        
        for(i=1;i<=sz;i++){
            cin(j);
            q2.pb(j);vis[j]=1;
            j=st[j];
            q.pb(j);s.insert(j);
        }
        
        //adding extra node
        q.pb(1);q2.pb(1);
        vis[1]=1;
        
        ll initial_cost=0;
        for(i=0;i<q2.size();i++){
            initial_cost+=dis(1,q2[i]);
        }
        
        //creating a copy
        for(i=0;i<q2.size();i++)
            q2[i]=st[q2[i]];
        sort(q2.begin(),q2.end());
        
        sort(q.begin(),q.end());
        int qs=q.size();
        for(i=1;i<qs;i++){
            int x=lca(rev[q[i]],rev[q[i-1]]);
            if(!vis[x])
                vis[x]=1,q.pb(st[x]),s.insert(st[x]);
        }
        sort(q.begin(),q.end());
        
        sz2=q2.size();
        
        //create reduced tree :)
        for(i=q.size()-1;i>=0;i--){
            vector<set<int>::iterator>v;
            set<int>::iterator it;
            int x=rev[q[i]];
            int l=st[x],r=en[x];
            it=s.lower_bound(l+1);
            while(it!=s.end()&&(*it)<=r){
                adj2[x].pb(mp(rev[*it],dis(x,rev[*it])));
                v.pb(it);
                it++;
            }
            for(j=0;j<v.size();j++)
                s.erase(v[j]);
        }
        dp[1]=initial_cost;
        chutia_ans(1,0,0);
        ll ans=0;
        for(i=1;i<q2.size();i++)
            ans+=dp[rev[q2[i]]];
        ans-=initial_cost;
        printf("%lld\n",ans/2);
        
        //reset
        for(i=0;i<q.size();i++)
            adj2[rev[q[i]]].clear(),adj2[q[i]].clear(),vis[q[i]]=0,vis[rev[q[i]]]=0;
        adj2[1].clear();
        vis[1]=0;
    }
    
    return 0;
}