#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int n;
int out[6010];
struct ff{
int cnt;
int next[6010];
}nod[6010];
int flag;
int fff[6010][2];
void search(int x)
{
for(int i=0;i<nod[x].cnt;i++){
search(nod[x].next[i]);
fff[x][1]=max(fff[x][1],fff[nod[x].next[i]][0]+fff[x][1]);
int kk=max(fff[nod[x].next[i]][0],fff[nod[x].next[i]][1]);
fff[x][0]=max(max(fff[x][0],fff[x][0]+kk),kk);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&fff[i][1]);
for(int i=1;i<=n;i++)nod[i].cnt=0;
for(int i=1;i<n;i++)
{
int a,b;
scanf("%d %d",&a,&b);
nod[b].next[nod[b].cnt]=a;
nod[b].cnt++;
out[a]++;
}
for(int i=1;i<=n;i++)
{
if(!out[i])
{
flag=i;
break;
}
}
search(flag);
printf("%d",max(max(fff[flag][0],fff[flag][1]),0));
return 0;
}