#include <iostream>
#include <assert.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <string.h>
#include <cmath>
#include <memory.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=100001;
int n,dp[17][N],rev[N],s[N],e[N],d[N],ud[N],T[N],dfs=-1,v[N*10],org[N*10],need[N],q[3*N],last;
vector<vector<pair<int,int> > > g;
void DFS(int u,int p){
	dp[0][u]=p;
	s[u]=++dfs;
	rev[dfs]=u;
	for(int i=0;i<g[u].size();++i)
		if(g[u][i].first!=p){
			d[g[u][i].first]=d[u]+g[u][i].second;
			ud[g[u][i].first]=ud[u]+1;
			T[g[u][i].first]=u;
			DFS(g[u][i].first,u);
		}
	e[u]=dfs;
}
int LCA(int u,int v){
	if(ud[u]<ud[v])
		swap(u,v);
	int l=0;
	while((1<<l)<=ud[u])
		++l;
	--l;
	for(int i=l;i>=0;--i)
		if(ud[u]-(1<<i)>=ud[v])
			u=dp[i][u];
	if(u==v)
		return u;
	for(int i=l;i>=0;--i)
		if(dp[i][u]!=dp[i][v]){
			u=dp[i][u];
			v=dp[i][v];
		}
	return T[u];
}
ll res;
int total;
vector<int> w;
int calc(int u,int p){
	int down=need[u];
	w.pop_back();
	while(!w.empty() && w.back()<=e[rev[u]])
		down+=calc(w.back(),u);
	if(p!=-1)
		res+=(ll)down*(total-down)*(ll)(d[rev[u]]-d[rev[p]]);
	return down;
}
int main()
{
	int t;
	scanf("%d%d",&n,&t);
	g.resize(n);
	for(int i=1,a,b,c;i<n;++i){
		scanf("%d%d%d",&a,&b,&c);
		--a;--b;
		g[a].push_back(make_pair(b,c));
		swap(a,b);
		g[a].push_back(make_pair(b,c));
	}
	DFS(n-1,-1);
	for(int k=1;(1<<k)<n;++k)
		for(int i=0;i<n;++i)
			if(dp[k-1][i]!=-1)
				dp[k][i]=dp[k-1][dp[k-1][i]];
	int k;
	w.reserve(n);
	while(t--){
		scanf("%d",&k);
		int z=k;
		total=k;
		for(int i=0;i<k;++i){
			scanf("%d",&v[i]);
			--v[i];
			org[i]=v[i];
			v[i]=s[v[i]];
		}
		sort(v,v+k);
		k=unique(v,v+k)-v;
		for(int i=0;i<k;++i)
			v[i]=rev[v[i]];
		q[0]=v[0];
		last=1;
		for(int i=1;i<k;++i){
			q[last]=LCA(q[last-1],v[i]);
			q[++last]=v[i];
			++last;
		}
		for(int i=0;i<last;++i)
			q[i]=s[q[i]];
		sort(q,q+last);
		k=unique(q,q+last)-q;
		for(int i=0;i<z;++i)
			++need[s[org[i]]];
		res=0;
		w.clear();
		w.assign(q,q+k);
		reverse(w.begin(),w.end());
		calc(w.back(),-1);
		for(int i=0;i<z;++i)
			need[s[org[i]]]=0;
		printf("%lld\n",res);
	}
	return 0;
}