//Solution by Zhusupov Nurlan #include <iostream> #include <cassert> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <algorithm> #include <set> #include <vector> #include <map> #include <string> #include <stack> #include <queue> #include <ctime> using namespace std; typedef long long LL; typedef map<string , int> MSI; typedef vector<int> VI; typedef pair<int, int> PII; #define pb(x) push_back(x) #define sqr(x) ((x) * (x)) #define F first #define S second #define SZ(t) ((int) t.size()) #define len(t) ((int) t.length()) #define base LL(1e9 + 7) #define fname "" #define sz (1000 * 100 + 10) #define EPS (1e-8) #define INF ((int)1e9 + 9) #define write(xx) printf("%d" , xx); #define readln(xx) getline(cin , xx) #define read(xx) scanf("%d" , &xx) #define mp make_pair const double PI = acos(-1.0); int in[sz], t, T, cnt[sz], out[sz], last, n, ww[sz], Ti, v, u, c, p[21][sz], s[21][sz], st[sz * 20], q[sz * 10], k; VI a[sz], b[sz]; LL res, ans; bool upper(int v, int u) { return in[v] <= in[u] && out[u] <= out[v]; } int lcm(int v, int u) { if (upper(v, u)) return v; for (int i = 20; i >= 0; i--) while (!upper(p[i][v], u)) v = p[i][v]; if (v == 1) return v; return p[0][v]; } bool cmp(int v, int u) { return in[v] < in[u]; } LL get(int v, int u) { if (v == u) return 0; res = 0; int V = v; for (int i = 20; i >= 0; i--) { while (!upper(p[i][v], u)) { res += s[i][v]; v = p[i][v]; } } return (res + s[0][v]) * cnt[V] * (k - cnt[V]); } void dfs(int v, int pr = 0) { in[v] = ++t; p[0][v] = pr; for (int i = 1; i <= 20; i++) { p[i][v] = p[i - 1][p[i - 1][v]]; s[i][v] = s[i - 1][v] + s[i - 1][p[i - 1][v]]; } for (int i = 0; i < a[v].size(); i++) { if (a[v][i] != pr) { s[0][a[v][i]] = b[v][i]; dfs(a[v][i], v); } } out[v] = ++t; } int main() { //freopen("in", "r", stdin); ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> T; for (int i = 1; i < n; i++) { cin >> v >> u >> c; a[v].pb(u); a[u].pb(v); b[v].pb(c); b[u].pb(c); } out[0] = INF; dfs(1); while (T--) { cin >> k; for (int i = 1; i <= k; i++) cin >> q[i]; Ti++; sort(q + 1, q + 1 + k, cmp); c = 1; st[c] = 1; cnt[1] = 0; ww[1] = Ti; ans = 0; for (int i = 1; i <= k; i++) { last = lcm(st[c], q[i]); while (!upper(st[c], q[i])) { if (last != st[c - 1] && upper(st[c - 1], q[i])) { if (ww[last] != Ti) ww[last] = Ti, cnt[last] = 0; cnt[last] = cnt[st[c]]; ans += get(st[c], last); } else { cnt[st[c - 1]] += cnt[st[c]]; ans += get(st[c], st[c - 1]); } c--; } if (last != st[c]) st[++c] = last; if (st[c] != q[i]) st[++c] = q[i]; if (ww[q[i]] != Ti) ww[q[i]] = Ti, cnt[q[i]] = 0; cnt[q[i]]++; } while (c > 1) { cnt[st[c - 1]] += cnt[st[c]]; ans += get(st[c], st[c - 1]); c--; } cout << ans << "\n"; } }