#include <algorithm>
#include <cassert>
#include <iostream>
#include <istream>
#include <vector>

const int MAX_N=6e3+5;

struct Node{
    std::vector<int> sons;
    int r;
}nodes[MAX_N];

bool had_father[MAX_N];

int dp[MAX_N][2];

void dfs(const int n){
    dp[n][1]=nodes[n].r;
    for(auto &i:nodes[n].sons){
        dfs(i);
        dp[n][0]+=std::max(dp[i][1],dp[i][0]);
        dp[n][1]+=dp[i][0];
    }
}

int main(){
    std::iostream::sync_with_stdio(false),std::cin.tie(0),std::cout.tie(0);

    int n;
    std::cin>>n;

    for(int i=1;i<=n;i++){
        int _r;
        std::cin>>_r;
        nodes[i].r=_r;
    }
    for(int i=1;i<n;i++){
        int s,f;
        std::cin>>s>>f;
        nodes[f].sons.push_back(s);
        had_father[s]=true;
    }
    int master{-1};
    for(int i=1;i<=n;i++){
        if(had_father[i]==false){
            master=i;
        }
    }
    assert(master!=-1);
    dfs(master);
    std::cout<<std::max(dp[master][0],dp[master][1])<<"\n";
}