#include<bits/stdc++.h>
using namespace std;
struct tree{
int k,d,b,r,son[6005];
}node[6005];
int n,f[6005][2];
bool vis[6005];
queue<int>q;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>node[i].r;
for(int i=1;i<=n-1;i++)
{
int l,k;
cin>>l>>k;
node[k].son[++node[k].k]=l;
node[l].b=k;
}
for(int i=1;i<=n;i++)
if(!node[i].k)
q.push(i);
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=1;i<=node[x].k;i++)
{
int j=node[x].son[i];
f[x][0]+=max(f[j][0],f[j][1]);
f[x][1]+=f[j][0];
}
f[x][1]+=node[x].r;
if(node[x].b&&!vis[node[x].b])
{
q.push(node[x].b);
vis[node[x].b]=1;
}
}
for(int i=1;i<=n;i++)
if(!node[i].b)
cout<<max(f[i][0],f[i][1]);
}