#define _CRT_SECURE_NO_WARNINGS #pragma comment(linker, "/stack:16777216") #include <string> #include <vector> #include <map> #include <list> #include <iterator> #include <set> #include <queue> #include <iostream> #include <sstream> #include <stack> #include <deque> #include <cmath> #include <memory.h> #include <cstdlib> #include <cstdio> #include <cctype> #include <algorithm> #include <utility> #include <time.h> using namespace std; #define FOR(i, a, b) for(int i=(a);i<(b);i++) #define RFOR(i, b, a) for(int i=(b)-1;i>=(a);--i) #define FILL(A,value) memset(A,value,sizeof(A)) #define ALL(V) V.begin(), V.end() #define SZ(V) (int)V.size() #define PB push_back #define MP make_pair #define Pi 3.14159265358979 typedef long long Int; typedef unsigned long long UInt; typedef vector<int> VI; typedef pair<int, int> PII; const int INF = 100000000; const int MAX = 200007; const int MAX2 = 7; const int BASE = 1000000007; const int MOD = 1000000007; const double eps = 1e-9; int n, m; int D[MAX]; VI I[MAX]; VI J[MAX]; vector<PII> G[MAX]; Int R[MAX]; set<PII> S[MAX]; int Id[MAX]; void dfs1(int v, int p, int h) { D[v] = h; FOR (i,0,SZ(G[v])) { int to = G[v][i].first; int w = G[v][i].second; if (to == p) continue; dfs1(to, v, h+w); } } int Merge(int a, int b, bool q, int d = 0) { if (SZ(S[b]) > SZ(S[b])) swap(a, b); for (set<PII>::iterator it = S[b].begin(); it != S[b].end(); ++it) { PII cur = *it; set<PII>::iterator it2 = S[a].lower_bound(MP(cur.first, -INF)); if (it2 == S[a].end() || it2->first != cur.first) S[a].insert(cur); else { PII other = *it2; S[a].erase(it2); if (q == 1) { R[cur.first] -= Int(d) * cur.second * other.second * 4; } S[a].insert(MP(cur.first, cur.second + other.second)); } } return a; } void dfs2(int v, int p) { Id[v] = -1; FOR (i,0,SZ(G[v])) { int to = G[v][i].first; if (to == p) continue; dfs2(to, v); if (Id[v] == -1) Id[v] = Id[to]; else Id[v] = Merge(Id[v], Id[to], 1, D[v]); } FOR (i,0,SZ(J[v])) { set<PII>::iterator it = S[v].lower_bound(MP(J[v][i], -INF)); if (it == S[v].end() || it->first != J[v][i]) S[v].insert(MP(J[v][i], 1)); else { PII p = *it; S[v].erase(it); S[v].insert(MP(p.first, p.second+1)); } } for (set<PII>::iterator it = S[v].begin(); it != S[v].end(); ++it) { if (it->second > 1) { R[it->first] -= Int(it->second) * (it->second-1) * D[v] * 2; } } if (Id[v] == -1) Id[v] = v; else Id[v] = Merge(Id[v], v, 1, D[v]); } int main() { //freopen("in.txt", "r", stdin); //freopen("intersection.in", "r", stdin); //freopen("intersection.out", "w", stdout); scanf("%d %d", &n, &m); FOR (i,0,n-1) { int u, v, w; scanf("%d %d %d", &u, &v, &w); -- u; -- v; G[u].PB(MP(v, w)); G[v].PB(MP(u, w)); } FOR (i,0,m) { int cnt; scanf("%d", &cnt); FOR (j,0,cnt) { int v; scanf("%d", &v); -- v; I[i].PB(v); J[v].PB(i); } } dfs1(0, -1, 0); FOR (i,0,m) { Int sum = 0; FOR (j,0,SZ(I[i])) sum += D[I[i][j]]; FOR (j,0,SZ(I[i])) { sum -= D[I[i][j]]; R[i] += Int(SZ(I[i])-1)*D[I[i][j]] + sum; sum += D[I[i][j]]; } } //FOR (i,0,m) //printf("%lld\n", R[i]); dfs2(0, -1); FOR (i,0,m) printf("%lld\n", R[i]/2); return 0; }