#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

vector<int> e[100005], wt[100005];
long long cnt[100005], dist[100005];
int first[100005], anc[100005];
int vert[300005], dep[300005];
int vnum = 0;

void setup(int v, int pre, int depth)
{
	first[v] = vnum;
    anc[v] = pre;
	vert[vnum] = v;
	dep[vnum] = depth;
    vnum++;
	for(int i = 0; i < e[v].size(); i++)
	{
		if(e[v][i] != pre)
		{
			dist[e[v][i]] = dist[v] + wt[v][i];
			setup(e[v][i], v, depth + 1);
	        vert[vnum] = v;
	        dep[vnum] = depth;
            vnum++;
		}
	}
}

long long ans;
/*pair<long long, long long> dfs(int v, int pre)
{
	
}*/

int lowr[300005][20], lowl[300005][20], lg[300005];

int main()
{
	//ios::sync_with_stdio(false);
    //cin.tie(0);
    
	int n, t;
	scanf("%d %d", &n, &t);
	for(int i = 1; i < n; i++)
	{
		int u, v, w;
		scanf("%d %d %d", &u, &v, &w);
		e[u].push_back(v);
		e[v].push_back(u);
		wt[u].push_back(w);
		wt[v].push_back(w);
	}

	dist[1] = 0;
	setup(1, 0, 0);

	for(int i = 0; i < vnum; i++) lowr[i][0] = lowl[i][0] = i;
	for(int j = 1; j < 20; j++)
	{
		for(int i = 0; i < vnum; i++)
		{
            int k = (1 << (j - 1));
			if(vnum <= i + k) lowr[i][j] = lowr[i][j - 1];
			else if(dep[lowr[i][j - 1]] <= dep[lowr[i + k][j - 1]]) lowr[i][j] = lowr[i][j - 1];
			else lowr[i][j] = lowr[i + k][j - 1];

			if(i - (1 << (j - 1)) < 0) lowl[i][j] = lowl[i][j - 1];
			else if(dep[lowl[i][j - 1]] <= dep[lowl[i - k][j - 1]]) lowl[i][j] = lowl[i][j - 1];
			else lowl[i][j] = lowl[i - k][j - 1];
		}
	}

	lg[1] = 0;
	for(int i = 2; i <= vnum; i++) lg[i] = 1 + lg[i/2];

	while(t--)
	{
		int k;
		scanf("%d", &k);
		ans = 0;
		if(k > 500)
		{
			memset(cnt, 0, sizeof(cnt));
			while(k--)
			{
				int x;
				scanf("%d", &x);
				cnt[x]++;
			}
			
            pair<long long, long long> ret[100005];
			for(int v = n; v >= 1; v--)
            {
                int pre = anc[v];
                long long cur = 0, num = 0;
                for(int i = 0; i < e[v].size(); i++)
                {
                    if(e[v][i] != pre)
                    {
                        auto temp = ret[e[v][i]];
                        temp.first += wt[v][i]*temp.second;
                        ans += cur*temp.second + temp.first*num;
                        cur += temp.first;
                        num += temp.second;
                    }
                }
                ans += cur*cnt[v];
                num += cnt[v];
                ret[v] = {cur, num};
            }
		}
		else
		{
			int l[100005];
			for(int i = 0; i < k; i++)
			{
                scanf("%d", &l[i]);
			}

			for(int i = 0; i < k; i++)
			{
				for(int j = i + 1; j < k; j++)
				{
					int u = first[l[i]], v = first[l[j]];
					if(v < u) swap(u, v);
					int a = lowr[u][lg[v - u + 1]], b = lowl[v][lg[v - u + 1]], lca;
					if(dep[a] < dep[b]) lca = vert[a];
					else lca = vert[b];
					ans += dist[l[i]] + dist[l[j]] - 2*dist[lca];
				}
			}
		}
		printf("%lld\n", ans);
	}

	return 0;
}