#include using namespace std; #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) #define ll long long const long long mod=998244353; const long long hmod=46216567629137; int main(){ cin.tie(0)->sync_with_stdio(0); cout.tie(0); int N,M; cin>>N>>M; int P[N+1]; int A[N],B[N]; int C[M+1]; for(int i=1;i<=N;i++) cin>>P[i]; vectorG[N+1]; for(int i=1;i<=N-1;i++){ cin>>A[i]>>B[i]; G[A[i]].push_back(B[i]); G[B[i]].push_back(A[i]); } for(int i=1;i<=M;i++) cin>>C[i]; int dist[N+1]; bool already[N+1]; for(int i=1;i<=N;i++){ dist[i]=1e9; already[i]=0; } queueQ; for(int i=1;i<=M;i++){ Q.push(C[i]); dist[C[i]]=0; } while(!Q.empty()){ int pos=Q.front(); Q.pop(); if(already[pos]) continue; already[pos]=1; for(int i=0;idist[pos]+1){ dist[nex]=dist[pos]+1; Q.push(nex); } } } vector>polute[N+1]; for(int i=1;i<=N;i++){ polute[dist[i]].push_back({-P[i],i}); } set>leaf; for(int i=1;i<=N;i++){ if(G[i].size()==1) leaf.insert({-P[i],i}); } ll ans=0; int siz[N+1]; bool poluted[N+1]; for(int i=1;i<=N;i++){ siz[i]=G[i].size(); poluted[i]=0; } rep(j,polute[0].size()){ leaf.erase(polute[0][j]); poluted[polute[0][j].second]=1; } for(int i=1;i<=N;i++){ if(leaf.size()==0) break; ans-=(*leaf.begin()).first; int pos=(*leaf.begin()).second; leaf.erase(*leaf.begin()); rep(j,G[pos].size()){ int nex=G[pos][j]; siz[nex]--; if(siz[nex]==1 && poluted[nex]==0) leaf.insert({-P[nex],nex}); } rep(j,polute[i].size()){ leaf.erase(polute[i][j]); poluted[polute[i][j].second]=1; } } cout<