#include <bits/stdc++.h> using namespace std; #define fru(j,n) for(int j=0; j<(n); ++j) #define tr(it,v) for(auto it=(v).begin(); it!=(v).end(); ++it) #define x first #define y second #define pb push_back #define mp make_pair #define ALL(G) (G).begin(),(G).end() typedef long long ll; typedef double D; typedef pair<int,int> pii; typedef pair<int,ll> pil; typedef pair<int,pil> PIL; typedef vector<int> vi; const int inft = 1000000009; const int MAXN = 1000006; vector<pii> V[MAXN]; set<PIL > S[MAXN]; int przen[MAXN]; long long ans[MAXN]; void DFS(int u,int s){ // printf("jestem w %d\n",u); tr(itv,V[u])if(itv->x!=s){ DFS(itv->x,u); //merge two sets; #define S1 S[itv->x] #define S2 S[u] #define P1 przen[itv->x] #define P2 przen[u] P1+=itv->y; if(S1.size()>S2.size()){ swap(S1,S2); swap(P1,P2); } //merge S1 into S2; tr(it,S1){ //search for corr item in S2 auto it2=S2.lower_bound(make_pair(it->x,pil(-1,-1))); if(it2==S2.end() || it2->x!=it->x){ PIL ns=*it; ns.y.y+=1LL*(P1-P2)*ns.y.x; // printf("u= %d dorzucam (%d,%d,%lld)\n",u,ns.x,ns.y.x,ns.y.y); S2.insert(ns); } else{ // printf("u= %d lacze (%d,%d,%lld) z (%d,%d,%lld)\n",u,it->x,it->y.x,it->y.y,it2->x,it2->y.x,it2->y.y); ans[it->x]+=1LL*it2->y.x*(it->y.y+1LL*it->y.x*P1);//cost ans[it->x]+=1LL*it->y.x*(it2->y.y+1LL*it2->y.x*P2); PIL ns=*it2; S2.erase(it2); ns.y.x+=it->y.x; ns.y.y+=it->y.y+1LL*it->y.x*(P1-P2);//cost // printf("u= %d dorzucam (%d,%d,%lld)\n",u,ns.x,ns.y.x,ns.y.y); S2.insert(ns); } } S1.clear(); } } void solve() { int n,t; scanf("%d%d",&n,&t); fru(i,n-1){ int a,b,c; scanf("%d%d%d",&a,&b,&c);a--;b--; V[a].pb(pii(b,c)); V[b].pb(pii(a,c)); } fru(i,t){ int k; scanf("%d",&k); vi X; fru(j,k){ int b; scanf("%d",&b);b--; X.pb(b); } sort(ALL(X)); fru(j,k){ int ile=upper_bound(ALL(X),X[j])-lower_bound(ALL(X),X[j]); S[X[j]].insert(make_pair(i,pil(ile,0))); j+=ile-1; } } DFS(0,-1); fru(i,t)printf("%lld\n",ans[i]); } int main() { // freopen("input.in", "r", stdin); // freopen("output.out", "w", stdout); int t=1; // scanf("%d",&t); fru(i,t) solve(); return 0; }