#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; }