#include <iostream> #include <unordered_map> #include <unordered_set> #include <vector> #include <cstdio> using namespace std; #define MAXN 300005 int Set[MAXN], Size[MAXN], Node[MAXN]; vector<pair<int, int>> G[MAXN]; vector<int> G2[MAXN]; int64_t Sol[MAXN]; int Dist[MAXN]; int nodes; int Leg(int a, int b, int d) { int parent = ++nodes; if(a>=0) G2[parent].push_back(a); if(b>=0) G2[parent].push_back(b); Dist[parent] = d; return parent; } void dfs(int node, int dist) { Node[node] = -1; for(auto e : G[node]) { if(!Node[e.first]) { dfs(e.first, dist + e.second); Node[node] = Leg(Node[node], Node[e.first], dist); } } if(Node[node] == -1) { Node[node] = ++nodes; Dist[nodes] = dist; } } unordered_map<int, int> Count[MAXN], Queries[MAXN]; int Union(int s1, int s2, int dist) { if(Count[s1].size() > Count[s2].size()) swap(s1, s2); for(auto &x : Count[s1]) { int q = x.first; int a = x.second; int b = Count[s2][q]; Sol[q] += dist * (1LL*a*a + 1LL*b*b - 1LL*(a+b)*(a+b)); Count[s2][q] = a + b; } return s2; } int main() { int n, t, a, b, c; cin>>n>>t; for(int i=1; i<n; i++) { cin>>a>>b>>c; G[a].push_back({b, c}); G[b].push_back({a, c}); } dfs(1, 0); for(int i=1; i<=t; i++) { cin>>Size[i]; for(int k=1; k<=Size[i]; k++) { cin>>a; Queries[Node[a]][i]++; } } for(int i=1; i<=nodes; i++) { if(G2[i].size() == 0) { Set[i] = i; } else if(G2[i].size() == 1) { Set[i] = Set[G2[i][0]]; } else { Set[i] = Union(Set[G2[i][0]], Set[G2[i][1]], Dist[i]); } for(auto q : Queries[i]) { Sol[q.first] += 1LL * Dist[i] * q.second * (Size[q.first] - q.second); Sol[q.first] -= 2LL * Dist[i] * q.second * Count[Set[i]][q.first]; Count[Set[i]][q.first] += q.second; } } for(int i=1; i<=t; i++) { cout<<Sol[i]<<'\n'; } return 0; }