#include <iostream> #include <cstdio> #include <vector> #include <algorithm> using namespace std; #define foru(i,a,b) for(int i = (a), _b = (b); i <= _b; ++i) #define ford(i,a,b) for(int i = (a), _b = (b); i >= _b; --i) const int N = 2E5+10, LEN = 750; typedef pair<int, int> pii; typedef long long ll; int n, din[N], dout[N], p[N], dep[N], rmq[N*2][20], m, pos[N*2], e[N*2], lg[N*2]; vector<pii> a[N]; ll f[N], ans; int nq, cnt[N], x[N], sum[N], now, ptr, node; vector<pii> q[N]; void enter() { scanf("%d %d", &n, &nq); foru(i,1,n-1) { int u, v, c; scanf("%d %d %d", &u, &v, &c); a[u].push_back(pii(v,c)); a[v].push_back(pii(u,c)); } foru(i,1,nq) { int k; scanf("%d", &k); foru(j,1,k) { scanf("%d", x+j); ++cnt[x[j]]; } foru(j,1,k) if (cnt[x[j]]) { q[i].push_back(pii(x[j], cnt[x[j]])); sum[i] += cnt[x[j]]; cnt[x[j]] = 0; } } } void dfs(int u) { din[u] = ++m; pos[u] = m; e[m] = u; foru(i,0,a[u].size()-1) { int v = a[u][i].first; if (p[v] == 0) { p[v] = u; f[v] = f[u] +a[u][i].second; dep[v] = dep[u] + 1; dfs(v); e[++m] = u; } } dout[u] = m; } void init() { p[1] = -1; m = 0; f[1] = 0; dfs(1); lg[0] = 0; foru(i,1,m) lg[i] = lg[i-1] + (1 << (lg[i-1]+1) <= i); foru(i,1,m) rmq[i][0] = e[i]; foru(j,1,lg[m]) foru(i,1<<j,m) { int x = rmq[i][j-1], y = rmq[i - (1 << (j-1))][j-1]; rmq[i][j] = (dep[x] < dep[y])? x: y; } } int lca(int u, int v) { int i = pos[u], j = pos[v]; if (i > j) swap(i, j); int k = lg[j-i+1]; int x = rmq[j][k], y = rmq[i+(1<<k)-1][k]; return (dep[x] < dep[y])? x: y; } bool cmp(const pii &a, const pii &b) { return din[a.first] < din[b.first]; } void dfs2(int u) { if (u == node) { cnt[u] = q[now][ptr].second; ++ptr; if (ptr == q[now].size()) return; node = q[now][ptr].first; } else cnt[u] = 0; foru(i,0,a[u].size()-1) { int v = a[u][i].first; if (p[v] == u && din[v] <= din[node] && dout[node] <= dout[v]) { dfs2(v); cnt[u] += cnt[v]; ans += ll(cnt[v]) * ll(sum[now] - cnt[v]) * a[u][i].second; if (ptr == q[now].size()) return; } } } void solve() { foru(i,1,nq) if (q[i].size() >= LEN) sort(q[i].begin(), q[i].end(), cmp); foru(z,1,nq) if (q[z].size() < LEN) { ll res = 0; foru(i,0,q[z].size()-2) foru(j,i+1,q[z].size()-1) { int x = q[z][i].first, y = q[z][j].first, r = lca(x,y); res += (f[x] + f[y] - f[r] * 2) * ll(q[z][i].second) * q[z][j].second; } printf("%lld\n", res); } else { ans = 0; now = z; ptr = 0; node = q[now][ptr].first; dfs2(1); printf("%lld\n", ans); } } int main() { //freopen("test.inp", "r", stdin); enter(); init(); //foru(i,1,m) cout << e[i] << " \n"[i==m]; //foru(i,1,m) cout << dep[e[i]] << " \n"[i==m]; //cout << pos[4] << " " << pos[7] << "\n"; solve(); }