#include <bits/stdc++.h> #define pb push_back #define all(x) (x).begin(), (x).end() #ifdef KAZAR #define eprintf(...) fprintf(stderr,__VA_ARGS__) #else #define eprintf(...) 0 #endif using namespace std; template<class T> inline void umax(T &a,T b){if(a < b) a = b;} template<class T> inline void umin(T &a,T b){if(a > b) a = b;} template<class T> inline T abs(T a){return a > 0 ? a : -a;} typedef long long ll; typedef pair<int, int> ii; typedef vector<int> vi; const int inf = 1e9 + 143; const ll longinf = 1e18 + 143; inline int read(){int x;scanf(" %d",&x);return x;} const int N = 1e5 + 100; vector<ii> g[N]; vi tasks[N]; int d[N], sz[N]; bool was[N]; vi vs; void dfs(int u,int p) { vs.pb(u); sz[u] = 1; for (auto e : g[u]) { int v = e.first; if (v != p && !was[v]) { d[v] = d[u] + e.second; dfs(v, u); sz[u] += sz[v]; } } } int best(int u,int p,int all) { for (auto e : g[u]) { int v = e.first; if (v != p && !was[v] && sz[v] * 2 > all) { return best(v, u, all); } } return u; } ll res[N]; ll sum[N]; int cnt[N]; void calc(int sgn) { for (int x : vs) { for (int id : tasks[x]) { sum[id] = cnt[id] = 0; } } for (int x : vs) { for (int id : tasks[x]) { res[id] += sgn * (sum[id] + (ll)cnt[id] * d[x]); sum[id] += d[x]; cnt[id] += 1; } } } void solve(int u) { vs.clear(); dfs(u, -1); u = best(u, -1, sz[u]); vs.clear(); d[u] = 0; dfs(u, -1); calc(+1); for (auto e : g[u]) { int v = e.first; int c = e.second; if (was[v]) continue; vs.clear(); d[v] = c; dfs(v, u); calc(-1); } was[u] = true; for (auto e : g[u]) { int v = e.first; if (!was[v]) { solve(v); } } } int main(){ #ifdef KAZAR freopen("f.input","r",stdin); freopen("f.output","w",stdout); freopen("error","w",stderr); #endif int n = read(); int t = read(); for (int i = 0; i < n - 1; i++) { int a = read() - 1; int b = read() - 1; int c = read(); g[a].pb({b, c}); g[b].pb({a, c}); } for (int i = 0; i < t; i++) { int k = read(); for (int j = 0; j < k; j++) { int u = read() - 1; tasks[u].pb(i); } } solve(0); for (int i = 0; i < t; i++) { printf("%lld\n", res[i]); } return 0; }