#include <cstdio> #include <vector> #include <cstring> using namespace std; vector<int> e[100005], wt[100005]; long long cnt[100005], dist[100005]; int first[100005], anc[100005]; int vert[300005], dep[300005]; int vnum = 0; void setup(int v, int pre, int depth) { first[v] = vnum; anc[v] = pre; vert[vnum] = v; dep[vnum] = depth; vnum++; for(int i = 0; i < e[v].size(); i++) { if(e[v][i] != pre) { dist[e[v][i]] = dist[v] + wt[v][i]; setup(e[v][i], v, depth + 1); vert[vnum] = v; dep[vnum] = depth; vnum++; } } } long long ans; /*pair<long long, long long> dfs(int v, int pre) { }*/ int lowr[300005][20], lowl[300005][20], lg[300005]; int main() { //ios::sync_with_stdio(false); //cin.tie(0); int n, t; scanf("%d %d", &n, &t); for(int i = 1; i < n; i++) { int u, v, w; scanf("%d %d %d", &u, &v, &w); e[u].push_back(v); e[v].push_back(u); wt[u].push_back(w); wt[v].push_back(w); } dist[1] = 0; setup(1, 0, 0); for(int i = 0; i < vnum; i++) lowr[i][0] = lowl[i][0] = i; for(int j = 1; j < 20; j++) { for(int i = 0; i < vnum; i++) { int k = (1 << (j - 1)); if(vnum <= i + k) lowr[i][j] = lowr[i][j - 1]; else if(dep[lowr[i][j - 1]] <= dep[lowr[i + k][j - 1]]) lowr[i][j] = lowr[i][j - 1]; else lowr[i][j] = lowr[i + k][j - 1]; if(i - (1 << (j - 1)) < 0) lowl[i][j] = lowl[i][j - 1]; else if(dep[lowl[i][j - 1]] <= dep[lowl[i - k][j - 1]]) lowl[i][j] = lowl[i][j - 1]; else lowl[i][j] = lowl[i - k][j - 1]; } } lg[1] = 0; for(int i = 2; i <= vnum; i++) lg[i] = 1 + lg[i/2]; while(t--) { int k; scanf("%d", &k); ans = 0; if(k > 500) { memset(cnt, 0, sizeof(cnt)); while(k--) { int x; scanf("%d", &x); cnt[x]++; } pair<long long, long long> ret[100005]; for(int v = n; v >= 1; v--) { int pre = anc[v]; long long cur = 0, num = 0; for(int i = 0; i < e[v].size(); i++) { if(e[v][i] != pre) { auto temp = ret[e[v][i]]; temp.first += wt[v][i]*temp.second; ans += cur*temp.second + temp.first*num; cur += temp.first; num += temp.second; } } ans += cur*cnt[v]; num += cnt[v]; ret[v] = {cur, num}; } } else { int l[100005]; for(int i = 0; i < k; i++) { scanf("%d", &l[i]); } for(int i = 0; i < k; i++) { for(int j = i + 1; j < k; j++) { int u = first[l[i]], v = first[l[j]]; if(v < u) swap(u, v); int a = lowr[u][lg[v - u + 1]], b = lowl[v][lg[v - u + 1]], lca; if(dep[a] < dep[b]) lca = vert[a]; else lca = vert[b]; ans += dist[l[i]] + dist[l[j]] - 2*dist[lca]; } } } printf("%lld\n", ans); } return 0; }