#include <bits/stdc++.h> using namespace std; int n; int q; int p1, p2, p3; vector < pair <int,int> > graf[100007]; int l; int pre[100007]; int post[100007]; int odl[100007]; int co[1000007]; int n1; pair <int,int> drzewo[1000007]; long long tak[100007]; long long suma[100007]; vector <int> wek; vector <int> wek2; int u, w; long long wyn; void dfs(int v, int oj, int o) { odl[v]=o; l++; pre[v]=l; post[v]=l; co[l]=v; for (int i=0; i<graf[v].size(); i++) { if (graf[v][i].first==oj) continue; dfs(graf[v][i].first, v, o+graf[v][i].second); l++; post[v]=l; co[l]=v; } } int potenga(int v) { for (int i=1; 1; i<<=1) { if (i>=v) { return i; } } } void start(int v, int a, int b) { if (a==b) { drzewo[v]=make_pair(odl[co[a]], co[a]); return; } start((v<<1), a, (a+b)>>1); start((v<<1)^1, (a+b+2)>>1, b); drzewo[v]=min(drzewo[(v<<1)], drzewo[(v<<1)^1]); } pair <int,int> czyt(int v, int a, int b, int graa, int grab) { if (a>=graa && b<=grab) { return drzewo[v]; } if (a>grab || b<graa) { return make_pair(1000000000,0); } return min( czyt((v<<1), a, (a+b)>>1, graa, grab) , czyt((v<<1)^1, (a+b+2)>>1, b, graa, grab) ); } int dajlca(int a, int b) { return czyt(1, 1, n1, min(pre[a], pre[b]), max(post[a], post[b])).second; } bool mniej(int a, int b) { return post[a]<post[b]; } int main() { odl[0]=1000000007; scanf("%d%d", &n, &q); for (int i=1; i<n; i++) { scanf("%d%d%d", &p1, &p2, &p3); graf[p1].push_back(make_pair(p2, p3)); graf[p2].push_back(make_pair(p1, p3)); } dfs(1, 0, 0); n1=potenga(l); start(1, 1, n1); while(q--) { scanf("%d", &p1); p3=p1; wek.clear(); wek2.clear(); wyn=0; while(p1--) { scanf("%d", &p2); wek.push_back(p2); } sort(wek.begin(), wek.end(), mniej); for (int i=wek.size()-1; i; i--) { p1=dajlca(wek[i], wek[i-1]); wek.push_back(p1); } for (int i=0; i<wek.size(); i++) { tak[wek[i]]=0; suma[wek[i]]=0; } for (int i=0; i<p3; i++) { tak[wek[i]]++; } sort(wek.begin(), wek.end(), mniej); for (int i=0; i<wek.size(); i++) { if (i && wek[i]==wek[i-1]) continue; u=wek[i]; //printf(" %d\n", u); while(!wek2.empty() && pre[u]<=pre[wek2.back()]) { w=wek2.back(); wek2.pop_back(); wyn+=tak[u]*(tak[w]*(odl[w]-odl[u])+suma[w])+tak[w]*suma[u]; suma[u]+=suma[w]+tak[w]*(odl[w]-odl[u]); tak[u]+=tak[w]; } wek2.push_back(u); //printf(" %lld %lld %lld", wyn, tak[i], suma[i]); } printf("%lld\n", wyn); } return 0; }