#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,root,fa[114514],value[114514];
int head[114514],dp[114514][2];
struct node{
int v,u,next;
}edge[114514];
void dfs(int u){
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
dfs(v);
dp[u][0]+=max(dp[v][0],dp[v][1]);
dp[u][1]+=dp[v][0];
}
}
int cnt=0;
void add(int u,int v){
edge[++cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&value[i]);
dp[i][1]=value[i];
}
for(int i=1;i<=n;i++){
fa[i]=i;
}
while(cin>>x>>y){
fa[x]=y;
add(x,y);
}
for(int i=1;i<=n;i++){
if(fa[i]==i){
root=i;
break;
}
}
dfs(root);
dp[root][0]=0;
dp[root][1]=value[1];
cout<<max(dp[root][0],dp[root][1])<<endl;
return 0;
}