#include<iostream>
#include<stdio.h>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=6005;
int value[maxn];
struct node
{
int fa,son,next;
}e[maxn];
int nume=0;
int head[maxn];
int n;
void add(int fa,int son)
{
e[++nume].fa=fa;
e[nume].son=son;
e[nume].next=head[fa];
head[fa]=nume;
}
bool son[maxn];
int dp[maxn][2];
void dfs(int root)
{
int i=head[root];
dp[root][1]=value[root];
dp[root][0]=0;
if(i==0)
return ;
while(i!=0)
{
dfs(e[i].son);
dp[root][1]+=dp[e[i].son][0];
dp[root][0]+=max(dp[e[i].son][0],dp[e[i].son][1]);
i=e[i].next;
}
}
int main()
{
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
cin>>value[i];
}
memset(head,0,sizeof(head));
memset(son,false,sizeof(son));
int fa,sson;
while(cin>>sson>>fa)
{
add(fa,sson);
son[sson]=1;
}
int a=1;
while(son[a])
a++;
dfs(a);
cout<<max(dp[a][0],dp[a][1]);
}
return 0;
}