#include <bits/stdc++.h> using namespace std; #define mp make_pair #define pb push_back typedef long long ll; typedef pair<int, int> pii; const int C = 316; const int MAXN = 100100; const int MAXM = 2 * MAXN; int n, m, k, q, sz; int to[MAXM], cost[MAXM], nxt[MAXM], head[MAXN], E; vector<int> traverse; int depth[MAXN]; int inPos[MAXN]; int st[MAXN]; int special[MAXN]; int d[MAXN]; ll res; int t[18][2 * MAXN]; int Log[2 * MAXN]; void buildST() { for (int i = 0; i < 2 * n - 1; ++i) t[0][i] = traverse[i]; for (int j = 1; j < 18; ++j) { for (int i = 0; i + (1 << j) - 1 < 2 * n - 1; ++i) { if (depth[t[j - 1][i]] < depth[t[j - 1][i + (1 << (j - 1))]]) t[j][i] = t[j - 1][i]; else t[j][i] = t[j - 1][i + (1 << (j - 1))]; } } } void addEdge(int a, int b, int c) { to[E] = b; cost[E] = c; nxt[E] = head[a]; head[a] = E++; to[E] = a; cost[E] = c; nxt[E] = head[b]; head[b] = E++; } void dfs(int v, int par = 0, int dep = 0, int dst = 0) { depth[v] = dep; d[v] = dst; inPos[v] = traverse.size(); traverse.pb(v); for (int id = head[v]; ~id; id = nxt[id]) { if (to[id] != par) { dfs(to[id], v, dep + 1, dst + cost[id]); traverse.pb(v); } } } int lca(int a, int b) { int l = inPos[a]; int r = inPos[b]; if (l > r) swap(l, r); int L = Log[r - l + 1]; int lt = t[L][l]; int rt = t[L][r - (1 << L) + 1]; if (depth[lt] < depth[rt]) return lt; return rt; } inline int dist(int a, int b) { if (a == b) return 0; return d[a] + d[b] - 2 * d[lca(a, b)]; } int dfs2(int v, int par = 0) { int ret = special[v]; for (int id = head[v]; ~id; id = nxt[id]) { if (to[id] != par) { int cur = dfs2(to[id], v); res += cost[id] * 1ll * cur * (sz - cur); ret += cur; } } return ret; } int main() { memset(head, 0xff, sizeof head); Log[1] = 0; for (int i = 2; i < 2 * MAXN; ++i) Log[i] = Log[i >> 1] + 1; scanf("%d%d", &n, &q); for (int i = 1, a, b, c; i < n; ++i) { scanf("%d%d%d", &a, &b, &c); --a; --b; addEdge(a, b, c); } dfs(0); buildST(); while (q --> 0) { scanf("%d", &sz); for (int i = 0, x; i < sz; ++i) { scanf("%d", &x); st[i] = --x; } res = 0; if (sz <= C) { for (int i = 0; i < sz; ++i) { for (int j = i + 1; j < sz; ++j) { res += dist(st[i], st[j]); } } } else { for (int i = 0; i < sz; ++i) { ++special[st[i]]; } dfs2(0); for (int i = 0; i < sz; ++i) { special[st[i]] = 0; } } printf("%lld\n", res); } return 0; }