#include <iostream>
#include <map>
#include <cstring>
#include <fstream>
#include <cstdio>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <utility>
#include <cstdlib>
#include <cassert>
#include <algorithm>
#include <ctime>
#include <vector>
using namespace std;
#define fname ""
#define ull unsigned long long
#define INF 1000000000
#define ll long long
#define F first
#define S second
#define mp make_pair
#define pb push_back
const int N = 200500;
int n, test;

int order[N], cnt = 0, first[N];
vector <pair<int, int> > a[N];
ll d[N];
int deep[N];

int t[20][N];
int id[20][N];
int lg[N];
int out[N], w[N], pre[N];

void dfs(int v, int p = 0) {
	order[++cnt] = v;
	pre[v] = p;
	for (int i = 0; i < (int)a[v].size(); ++ i) {
		int to = a[v][i].F;
		int len = a[v][i].S;
		if (to != p) {
			w[to] = len;
			d[to] = d[v] + len;
			deep[to] = deep[v] + 1;
			dfs(to, v);
			order[++cnt] = v;
		}
	}
	out[++out[0]] = v;
}

int len;

inline int lca(int x, int y) {
	x = first[x];
	y = first[y];
	if (x > y) swap(x, y);
	len = lg[y - x + 1];
	if (t[len][x] <= t[len][y - (1 << len) + 1]) return id[len][x];
	else return id[len][y - (1 << len) + 1];
}

int sz, all[N];

int ver;
inline void slow() {
	ll ans = 0;
	for (int i = 1; i <= sz; ++ i) {
		for (int j = i + 1; j <= sz; ++ j) {
			ver = lca(all[i], all[j]);
			ans += d[all[i]] + d[all[j]] - 2ll * d[ver];
		}
	}
	printf("%lld\n", ans);
}

int ss[N];

inline void solve() {
	scanf("%d", &sz);
	for (int i = 1; i <= sz; ++ i) {
		scanf("%d", &all[i]);
	}
	if (sz <= 400) {
		slow();
	}
	else {
		for (int i = 1; i <= sz; ++ i) {
			ss[all[i]]++;
		}
		
		ll res = 0;
		
		for (int i = 1; i <= n; ++ i) {
			res += (ll)ss[out[i]] * (sz - ss[out[i]]) * w[out[i]];
			ss[pre[out[i]]] += ss[out[i]];
		}

		for (int i = 1; i <= n; ++ i) {
			ss[i] = 0;
		}
		printf("%lld\n", res);
	}
}

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

	scanf("%d%d", &n, &test);

	for (int i = 1; i < n; ++ i) {
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);
		a[x].pb(mp(y, z));
		a[y].pb(mp(x, z));
	}

	dfs(1);

	for (int i = 1; i <= cnt; ++ i) {
		lg[i] = lg[i - 1];
		if ((1 << (lg[i] + 1)) == i) ++ lg[i];
		t[0][i] = deep[order[i]];
		id[0][i] = order[i];
		if (!first[order[i]]) first[order[i]] = i;
	}

	for (int i = 1; i <= lg[cnt]; ++ i) {
		for (int j = 1; j + (1 << i) - 1 <= cnt; ++ j) {
			if (t[i - 1][j] <= t[i - 1][j + (1 << (i - 1))]) {
				t[i][j] = t[i - 1][j];
				id[i][j] = id[i - 1][j];
			}
			else {
				t[i][j] = t[i - 1][j + (1 << (i - 1))];
				id[i][j] = id[i - 1][j + (1 << (i - 1))];
			}
		}
	}

	while (test--) solve();

	return 0;
}