#include<fstream>
#include<algorithm>
using namespace std;
typedef struct lnod {
int info;
lnod *next;
}*nod;
int i,n,a[16005],x,y,rs=-16000001;
bool viz[16005];
nod lda[16005];
void add(int x,nod &y) {
nod p=new lnod;
p->info=x;
p->next=y;
y=p;
}
void dfs(int x) {
viz[x]=1;
nod p=new lnod;
for(p=lda[x];p;p=p->next)
if(!viz[p->info])
{
dfs(p->info);
if(a[p->info]>0) a[x]+=a[p->info],rs=max(rs,a[x]);
}
}
int main()
{
ifstream cin("asmax.in");
ofstream cout("asmax.out");
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<n;i++)
{
cin>>x>>y;
add(x,lda[y]);
add(y,lda[x]);
}
dfs(1);
cout<<rs<<'\n';
return 0;
}