#include using namespace std; using ll = long long; #ifdef LOCAL #include #else #define dbg(...) 0 #define dbgn(...) 0 #endif void solve() { int n, m; cin >> n >> m; vector p(n); for (int i = 0; i < n; i++) { cin >> p[i]; } vector> adj(n); vector degree(n); for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; u--, v--; adj[u].push_back(v); adj[v].push_back(u); degree[u]++; degree[v]++; } vector ct(n, 1e9); queue q; for (int i = 0; i < m; i++) { int x; cin >> x; x--; ct[x] = 0; q.push(x); } while (!q.empty()) { int u = q.front(); q.pop(); for (int v : adj[u]) { if (ct[v] == 1e9) { ct[v] = ct[u] + 1; q.push(v); } } } priority_queue> pq; for (int i = 0; i < n; i++) { if (degree[i] == 1) { pq.push({p[i], ct[i], i}); } } vector rem(n, false); ll ans = 0; for (int t = 1; t <= n; t++) { bool cr = false; while (!pq.empty()) { auto [pur, c_time, idx] = pq.top(); if (rem[idx]) { pq.pop(); continue; } if (c_time >= t) { pq.pop(); ans += pur; rem[idx] = true; cr = true; for (int x : adj[idx]) { if (!rem[x]) { degree[x]--; if (degree[x] == 1) { pq.push({p[x], ct[x], x}); } } } break; } else pq.pop(); } if (!cr) break; } cout << ans << '\n'; } int32_t main() { cin.tie(0)->sync_with_stdio(0); solve(); return 0; }