#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#define N 6005
struct edge
{
int v;
int next;
} path[N << 1];
int head[N], e, n;
int dp[N][2], val[N], into[N];
void init( )
{
e = 0;
memset(head, -1, sizeof(head));
memset(dp, 0, sizeof(dp));
memset(into, 0, sizeof(into));
}
void Addpath( int u, int v)
{
path[e].v = v;
path[e].next = head[u];
head[u] = e++;
}
void dfs( int p )
{
dp[p][0] = 0;
dp[p][1] = val[p];
for( int i = head[p]; i != -1; i = path[i].next)
{
int x = path[i].v;
dfs(x);
dp[p][1] += dp[x][0];
dp[p][0] += max(dp[x][0], dp[x][1]);
}
return ;
}
int main()
{
int u ,v, ans;
while(scanf("%d",&n) != EOF)
{
for( int i = 1; i <= n; i++)
scanf("%d",&val[i]);
init();
ans = 0;
while(scanf("%d %d", &v, &u) != EOF && ( u + v))
{
Addpath(u, v);
into[v]++;
}
for( int i = 1; i <= n; i++)
{
if(into[i] == 0)
{
dfs(i);
ans += max(dp[i][0], dp[i][1]) ;
}
}
printf("%d\n",ans);
}
}
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#define N 6005
struct edge
{
int v;
int next;
} path[N << 1];
int head[N], e, n;
int dp[N][2], val[N], into[N];
void init( )
{
e = 0;
memset(head, -1, sizeof(head));
memset(dp, 0, sizeof(dp));
memset(into, 0, sizeof(into));
}
void Addpath( int u, int v)
{
path[e].v = v;
path[e].next = head[u];
head[u] = e++;
}
void dfs( int p )
{
dp[p][0] = 0;
dp[p][1] = val[p];
for( int i = head[p]; i != -1; i = path[i].next)
{
int x = path[i].v;
dfs(x);
dp[p][1] += dp[x][0];
dp[p][0] += max(dp[x][0], dp[x][1]);
}
return ;
}
int main()
{
int u ,v, ans;
while(scanf("%d",&n) != EOF)
{
for( int i = 1; i <= n; i++)
scanf("%d",&val[i]);
init();
ans = 0;
while(scanf("%d %d", &v, &u) != EOF && ( u + v))
{
Addpath(u, v);
into[v]++;
}
for( int i = 1; i <= n; i++)
{
if(into[i] == 0)
{
dfs(i);
ans += max(dp[i][0], dp[i][1]) ;
}
}
printf("%d\n",ans);
}
}