#include //#include using namespace std; //using namespace atcoder; using ll = long long; //using mint = modint998244353; int main(){ cin.tie(nullptr); ios_base::sync_with_stdio(false); /* 葉の頂点の純粋さの多重集合を持っておく。 これから純粋さが最大のものを答えに足し、多重集合から取り除く。 時刻iに汚染されるような葉の頂点の集合v(i)を求めておき、(i<=10^5) 取り除くたびにiをインクリメントしてv(i)に対応する純粋さを多重集合から取り除く。 */ ll N, M; cin >> N >> M; vector P(N); for (int i=0; i> P[i]; vector> E(N); for (int i=0; i> a >> b; a--; b--; E[a].push_back(b); E[b].push_back(a); } vector C(M); for (int i=0; i> C[i]; C[i]--; } vector dist(N, 1e9); queue que; for (int i=0; i st; vector> v(N+1); for (int i=0; i 0) st.insert(P[i]); v[dist[i]].push_back(i); } } ll ans=0, now=1, val; while(!st.empty() && now <= N){ val = *st.rbegin(); ans += val; st.erase(st.find(val)); for (auto x : v[now]) if (st.count(P[x])) st.erase(st.find(P[x])); now++; } cout << ans << endl; return 0; }