#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <strings.h>
#include <cstring>

using namespace std;
typedef long long int Z;

constexpr int N = 1 << 18;
int X[18][N];

struct E {
	int dest;
	int cost;
};

int n, t;
vector<vector<E>> G;
int pos[N];
int idx = 0;

void dfs1(int v, int h = 0, int p = -1) {
	X[0][idx] = h;
	pos[v] = idx++;
	for(E e : G[v]) {
		if(e.dest == p) continue;
		dfs1(e.dest, h + e.cost, v);
		X[0][idx++] = h;
	}
}
void init() {
	for(int i = 1; i < 18; ++i) {
		for(int p = 0; p + (1 << i) <= N; ++p) {
			X[i][p] = min(X[i - 1][p], X[i - 1][p + (1 << (i - 1))]);
		}
	}
}

int dist(int a, int b) {
	int x = pos[a];
	int y = pos[b];
	if(x > y) swap(x, y);
	++y;
	int i = 31 - __builtin_clz(y - x);
	int lh = min(X[i][x], X[i][y - (1 << i)]);
	return X[0][pos[a]] + X[0][pos[b]] - 2 * lh;
}

constexpr int KB = 450;
int R[KB];
int sum[N];
int k;
Z ret;

pair<int, E> chs[2 * N];
int chsidx = 0;

void dfslol(int v, int p = -1) {
	for(E e : G[v]) {
		if(e.dest == p) continue;
		dfslol(e.dest, v);
		chs[chsidx++] = make_pair(v, e);
	}
}

void dfs2() {
	for(int i = 0; i < chsidx; ++i) {
		int v = chs[i].first;
		E e = chs[i].second;
		ret += (Z)e.cost * (Z)sum[e.dest] * (Z)(k - sum[e.dest]);
		sum[v] += sum[e.dest];
	}
}

int main() {
	scanf("%d %d", &n, &t);
	G.resize(n);
	for(int i = 0; i < n - 1; ++i) {
		int a, b, c;
		scanf("%d %d %d", &a, &b, &c);
		--a;
		--b;
		G[a].push_back(E{b, c});
		G[b].push_back(E{a, c});
	}
	
	dfs1(0);
	init();
	dfslol(0);
	
	for(int i = 0; i < t; ++i) {
		scanf("%d", &k);
		if(k < KB) {
			for(int j = 0; j < k; ++j) {
				scanf("%d", &R[j]);
				--R[j];
			}
			ret = 0;
			for(int a = 0; a < k; ++a) {
			for(int b = a + 1; b < k; ++b) {
				ret += dist(R[a], R[b]);
			}
			}
		} else {
			fill(sum, sum + N, 0);
			for(int j = 0; j < k; ++j) {
				int v;
				scanf("%d", &v);
				--v;
				++sum[v];
			}
			ret = 0;
			dfs2();
		}
		printf("%lld\n", ret);
	}
	
	return 0;
}