#include <iostream> #include <algorithm> #include <vector> #define MAXN 100010 #define LOG 17 using namespace std; int n,t; vector<pair<int,int> > e[MAXN]; int par[MAXN][LOG]; int d[MAXN]; int lid[MAXN],rid[MAXN],curid; void dfs(int u, int prv) { lid[u] = ++curid; for (auto p : e[u]) { int v = p.first; int w = p.second; if (v == prv) continue; d[v] = d[u] + w; par[v][0] = u; dfs(v,u); } rid[u] = curid; } bool is_ancestor(int p, int u) { return lid[p] <= lid[u] && lid[u] <= rid[p]; } int lca(int u, int v) { if (is_ancestor(u,v)) return u; if (is_ancestor(v,u)) return v; for (int i = LOG-1; i >= 0; i--) { if (par[u][i] != 0 && !is_ancestor(par[u][i],v)) u = par[u][i]; } return par[u][0]; } bool id_cmp(const int a, const int b) { return lid[a] < lid[b]; } int k; vector<int> v; int ct[MAXN]; int pp[MAXN]; vector<int> ch[MAXN]; void build_tree() { sort(v.begin(),v.end(),id_cmp); for (int i = 1; i < k; i++) { v.push_back(lca(v[i-1],v[i])); } sort(v.begin(),v.end(),id_cmp); v.erase(unique(v.begin(),v.end()),v.end()); int u = v[0]; for (int i = 1; i < v.size(); i++) { while (rid[u] < lid[v[i]]) u = pp[u]; pp[v[i]] = u; ch[u].push_back(v[i]); u = v[i]; } } long long solve(int u) { long long res = 0; for (int v : ch[u]) { res += solve(v); ct[u] += ct[v]; long long w = d[v] - d[u]; res += w * ct[v] * (k - ct[v]); } return res; } int main() { ios::sync_with_stdio(0); cin >> n >> t; for (int i = 1; i < n; i++) { int a,b,c; cin >> a >> b >> c; e[a].push_back(make_pair(b,c)); e[b].push_back(make_pair(a,c)); } dfs(1,0); for (int j = 1; j < LOG; j++) for (int i = 1; i <= n; i++) par[i][j] = par[par[i][j-1]][j-1]; while (t--) { cin >> k; for (int i = 0; i < k; i++) { int x; cin >> x; v.push_back(x); ct[x]++; } build_tree(); cout << solve(v[0]) << '\n'; for (int u : v) { ct[u] = 0; pp[u] = 0; ch[u].clear(); } v.clear(); } }