#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pdd pair<double,double>
#define X first
#define Y second
#define REP(i,a) for(int i=0;i<a;++i)
#define REPP(i,a,b) for(int i=a;i<b;++i)
#define FILL(a,x) memset(a,x,sizeof(a))
#define foreach( gg,itit )  for( typeof(gg.begin()) itit=gg.begin();itit!=gg.end();itit++ )
#define mp make_pair
#define pb push_back
#define sz(a) int((a).size())
#define all(a)  a.begin(), a.end()
#define debug(ccc)  cout << #ccc << " = " << ccc << endl;
#define present(c,x) ((c).find(x) != (c).end())
const double eps = 1e-8;
#define EQ(a,b) (fabs((a)-(b))<eps)
inline int max(int a,int b){return a<b?b:a;}
inline int min(int a,int b){return a>b?b:a;}
inline ll max(ll a,ll b){return a<b?b:a;}
inline ll min(ll a,ll b){return a>b?b:a;}
const int mod = 1e9+7;
const int N = 1e5+10;
const ll inf = 1e18;
ll fl(ll x, ll y) {
    if (x >= 0) return x / y; return x / y - (x % y ? 1 : 0);
}
ll cl(ll x, ll y) {
    if (x >= 0) return (x + y - 1) / y;    return x / y;
}

ll power(ll a,ll n){
  if(n==0){
    return 1;
  }
  ll b = power(a,n/2);
  b = b*b%mod;
  if(n%2) b= b*a%mod;
  return b;
}

vector <pii> G[N],G1[N];
vector <int> S[N];
int tin[N],tout[N],depth[N],timer=1,T[2*N],parent[N],L[20][N],global;
ll dis[N],st;
vector <int> A;
ll ans=0;

int LCA(int a,int b){
  if(depth[a]>depth[b]) swap(a,b);
  int dif = depth[b]-depth[a];
  int c=0;
  while(dif>0){
    if(dif&1){
      b = L[c][b];
    }
    c++;dif/=2;
  }
  if(a==b)  return a;
  for(int i=19;i>=0;i--){
    if(L[i][a]!=L[i][b]){
      a = L[i][a];b= L[i][b];
    }
  }
  return L[0][a];
}

void dfs(int i,int par,int d){
  depth[i]=d;
  parent[i]=par;L[0][i]=par;
  tin[i]=timer++;
  T[tin[i]]=i;
  REP(j,G1[i].size()){
    int to = G1[i][j].X;
    if(to==par){ dis[i]=dis[par]+G1[i][j].Y;continue;}
    G[i].pb(G1[i][j]);
    dfs(to,i,d+1);
    S[i].pb(tin[to]);
  }
  tout[i]=timer++;
  T[tout[i]]= i;
}

ll f(int a,int b){
//  printf("%d %d %d %d\n",a,b,T[A[a]],T[A[b]]);
  if(a>b) return 0;
  ll l = b-a+1;
  if(a==b){
    //printf("%d\n",dis[T[A[a]]]);
    return dis[T[A[a]]];
  }
  int p = LCA(T[A[a]],T[A[b]]);
  //printf("p = %d\n",p);
  ll sum=0,c=0;
  while(A[a]==tin[p]){
    c++;a++;
  }
  //printf("%d %d %d %d\n",a,b,T[A[a]],T[A[b]]);
  while(a<=b){
    int in = upper_bound(all(S[p]),A[a]) - S[p].begin();
    in--;

    int in1 = upper_bound(all(A),tout[G[p][in].X])-A.begin();
   // printf("h %d %d %d %d\n",in,in1-a,tout[G[p][in].X],G[p][in].X);
    ll x = f(a,in1-1);

    x-=dis[p]*(in1-a);
   // printf("x = %lld\n",x);
    ans+=x*c+(in1-a)*sum;
    sum+=x;
    c+=in1-a;
    a = in1;
  }

 // st+=B[g].size();
 // printf("%lld\n",st);

 // printf("%lld %lld\n",ans,c);
  return sum+ l*dis[p];
}

int main(){
  int n,t;
  scanf("%d %d",&n,&t);
  REP(i,n-1){
    int u,v,c;
    scanf("%d %d %d",&u,&v,&c);
    //u = i+1;v=i+2;c=1;
    G1[u].pb(mp(v,c));
    G1[v].pb(mp(u,c));
  }
  dfs(1,0,1);
  REPP(j,1,20){
    REPP(i,1,n+1) L[j][i] = L[j-1][L[j-1][i]];
  }
 // printf("HI\n");
  REP(i,t){
    int k;
    scanf("%d",&k);
    A.clear();
    REP(j,k){
      int u;scanf("%d",&u);
      //u = 1;
      A.pb(tin[u]);
    //  printf("%d\n",tin[u]);
    }
    sort(all(A));
    ans=0;
    f(0,A.size()-1);
    printf("%lld\n",ans);
  }
  return 0;
}