#include <iostream> #include <map> #include <cstring> #include <fstream> #include <cstdio> #include <math.h> #include <queue> #include <stack> #include <set> #include <string> #include <utility> #include <cstdlib> #include <cassert> #include <algorithm> #include <ctime> #include <vector> using namespace std; #define fname "" #define ull unsigned long long #define INF 1000000000 #define ll long long #define F first #define S second #define mp make_pair #define pb push_back const int N = 200500; int n, test; int order[N], cnt = 0, first[N]; vector <pair<int, int> > a[N]; ll d[N]; int deep[N]; int t[20][N]; int id[20][N]; int lg[N]; int out[N], w[N], pre[N]; void dfs(int v, int p = 0) { order[++cnt] = v; pre[v] = p; for (int i = 0; i < (int)a[v].size(); ++ i) { int to = a[v][i].F; int len = a[v][i].S; if (to != p) { w[to] = len; d[to] = d[v] + len; deep[to] = deep[v] + 1; dfs(to, v); order[++cnt] = v; } } out[++out[0]] = v; } int len; inline int lca(int x, int y) { x = first[x]; y = first[y]; if (x > y) swap(x, y); len = lg[y - x + 1]; if (t[len][x] <= t[len][y - (1 << len) + 1]) return id[len][x]; else return id[len][y - (1 << len) + 1]; } int sz, all[N]; int ver; inline void slow() { ll ans = 0; for (int i = 1; i <= sz; ++ i) { for (int j = i + 1; j <= sz; ++ j) { ver = lca(all[i], all[j]); ans += d[all[i]] + d[all[j]] - 2ll * d[ver]; } } printf("%lld\n", ans); } int ss[N]; inline void solve() { scanf("%d", &sz); for (int i = 1; i <= sz; ++ i) { scanf("%d", &all[i]); } if (sz <= 400) { slow(); } else { for (int i = 1; i <= sz; ++ i) { ss[all[i]]++; } ll res = 0; for (int i = 1; i <= n; ++ i) { res += (ll)ss[out[i]] * (sz - ss[out[i]]) * w[out[i]]; ss[pre[out[i]]] += ss[out[i]]; } for (int i = 1; i <= n; ++ i) { ss[i] = 0; } printf("%lld\n", res); } } int main() { // freopen("in", "r", stdin); // freopen("out", "w", stdout); scanf("%d%d", &n, &test); for (int i = 1; i < n; ++ i) { int x, y, z; scanf("%d%d%d", &x, &y, &z); a[x].pb(mp(y, z)); a[y].pb(mp(x, z)); } dfs(1); for (int i = 1; i <= cnt; ++ i) { lg[i] = lg[i - 1]; if ((1 << (lg[i] + 1)) == i) ++ lg[i]; t[0][i] = deep[order[i]]; id[0][i] = order[i]; if (!first[order[i]]) first[order[i]] = i; } for (int i = 1; i <= lg[cnt]; ++ i) { for (int j = 1; j + (1 << i) - 1 <= cnt; ++ j) { if (t[i - 1][j] <= t[i - 1][j + (1 << (i - 1))]) { t[i][j] = t[i - 1][j]; id[i][j] = id[i - 1][j]; } else { t[i][j] = t[i - 1][j + (1 << (i - 1))]; id[i][j] = id[i - 1][j + (1 << (i - 1))]; } } } while (test--) solve(); return 0; }