#define _CRT_SECURE_NO_WARNINGS
#pragma comment(linker, "/stack:16777216")
#include <string>
#include <vector>
#include <map>
#include <list>
#include <iterator>
#include <set>
#include <queue>
#include <iostream>
#include <sstream>
#include <stack>
#include <deque>
#include <cmath>
#include <memory.h>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <utility>
#include <time.h>
using namespace std;

#define FOR(i, a, b) for(int i=(a);i<(b);i++)
#define RFOR(i, b, a) for(int i=(b)-1;i>=(a);--i)
#define FILL(A,value) memset(A,value,sizeof(A))

#define ALL(V) V.begin(), V.end()
#define SZ(V) (int)V.size()
#define PB push_back
#define MP make_pair
#define Pi 3.14159265358979

typedef long long Int;
typedef unsigned long long UInt;
typedef vector<int> VI;
typedef pair<int, int> PII;

const int INF = 100000000;
const int MAX = 200007;
const int MAX2 = 7;
const int BASE = 1000000007;
const int MOD = 1000000007;
const double eps = 1e-9;

int n, m;
int D[MAX];
VI I[MAX];
VI J[MAX];
vector<PII> G[MAX];
Int R[MAX];
set<PII> S[MAX];
int Id[MAX];

void dfs1(int v, int p, int h)
{
	D[v] = h;
	FOR (i,0,SZ(G[v]))
	{
		int to = G[v][i].first;
		int w = G[v][i].second;
		if (to == p)
			continue;
		dfs1(to, v, h+w);
	}
}

int Merge(int a, int b, bool q, int d = 0)
{
	if (SZ(S[b]) > SZ(S[b]))
		swap(a, b);
	for (set<PII>::iterator it = S[b].begin(); it != S[b].end(); ++it)
	{
		PII cur = *it;
		set<PII>::iterator it2 = S[a].lower_bound(MP(cur.first, -INF));
		if (it2 == S[a].end() || it2->first != cur.first)
			S[a].insert(cur);
		else
		{
			PII other = *it2;
			S[a].erase(it2);
			if (q == 1)
			{
				R[cur.first] -= Int(d) * cur.second * other.second * 4;
			}
			S[a].insert(MP(cur.first, cur.second + other.second));
		}
	}
	return a;
}

void dfs2(int v, int p)
{
	Id[v] = -1;
	FOR (i,0,SZ(G[v]))
	{
		int to = G[v][i].first;
		if (to == p)
			continue;
		dfs2(to, v);
		if (Id[v] == -1)
			Id[v] = Id[to];
		else
			Id[v] = Merge(Id[v], Id[to], 1, D[v]);
	}
	FOR (i,0,SZ(J[v]))
	{
		set<PII>::iterator it = S[v].lower_bound(MP(J[v][i], -INF));
		if (it == S[v].end() || it->first != J[v][i])
			S[v].insert(MP(J[v][i], 1));
		else
		{
			PII p = *it;
			S[v].erase(it);
			S[v].insert(MP(p.first, p.second+1));
		}
	}
	for (set<PII>::iterator it = S[v].begin(); it != S[v].end(); ++it)
	{
		if (it->second > 1)
		{
			R[it->first] -= Int(it->second) * (it->second-1) * D[v] * 2;
		}
	}
	if (Id[v] == -1)
		Id[v] = v;
	else
		Id[v] = Merge(Id[v], v, 1, D[v]);
}

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("intersection.in", "r", stdin);
	//freopen("intersection.out", "w", stdout);


	scanf("%d %d", &n, &m);
	FOR (i,0,n-1)
	{
		int u, v, w;
		scanf("%d %d %d", &u, &v, &w);
		-- u;
		-- v;
		G[u].PB(MP(v, w));
		G[v].PB(MP(u, w));
	}
	FOR (i,0,m)
	{
		int cnt;
		scanf("%d", &cnt);
		FOR (j,0,cnt)
		{
			int v;
			scanf("%d", &v);
			-- v;
			I[i].PB(v);
			J[v].PB(i);
		}
	}
	dfs1(0, -1, 0);
	FOR (i,0,m)
	{
		Int sum = 0;
		FOR (j,0,SZ(I[i]))
			sum += D[I[i][j]];
		FOR (j,0,SZ(I[i]))
		{
			sum -= D[I[i][j]];
			R[i] += Int(SZ(I[i])-1)*D[I[i][j]] + sum;
			sum += D[I[i][j]];
		}
	}
	//FOR (i,0,m)
		//printf("%lld\n", R[i]);
	dfs2(0, -1);
	FOR (i,0,m)
		printf("%lld\n", R[i]/2);










	return 0;
}