#include using namespace std; using ll=long long; template ll SZ(const T &a){ return a.size(); } constexpr ll N=200010; constexpr ll inf=1e18; ll sub,n,a[N],fa[N]; vector T[N]; void dfs(ll u){ for(ll v:T[u]){ fa[v]=u; T[v].erase(find(T[v].begin(),T[v].end(),u)); dfs(v); } } int main(){ ios::sync_with_stdio(0),cin.tie(0); cin>>sub>>n; for(ll i=1;i<=n;i++){ cin>>a[i]; } T[0].push_back(1); for(ll i=1,u,v;i>u>>v; T[u].push_back(v); T[v].push_back(u); } dfs(1); ll s=0; a[0]=-inf; while(1){ ll rt=0; for(ll u=1;u<=n;u++){ if(SZ(T[u])){ ll ok=1; for(ll v:T[u]){ if(SZ(T[v])){ ok=0; break; } } if(ok){ rt=u; break; } } } if(!rt){ break; } ll son=rt; for(ll u:T[rt]){ if(a[u]>a[son]){ son=u; } } if(son==rt){ for(ll u:T[rt]){ fa[u]=fa[rt]; T[fa[u]].push_back(u); } T[rt].clear(); continue; } a[rt]-=a[son]; T[rt].erase(find(T[rt].begin(),T[rt].end(),son)); if(!SZ(T[rt])){ s+=a[rt]; T[fa[rt]].erase(find(T[fa[rt]].begin(),T[fa[rt]].end(),rt)); continue; } son=0; for(ll u:T[rt]){ if(a[u]>a[son]){ son=u; } } a[rt]+=a[son]; T[rt].erase(find(T[rt].begin(),T[rt].end(),son)); } sort(T[0].begin(),T[0].end(),[&](ll u,ll v)->ll{ return a[u]>a[v]; }); ll o=1,ans=0; for(ll u:T[0]){ ans+=o*a[u]; o=-o; } ans+=o*s; cout<