#include <iostream>
#include <cstring>


using namespace std;

const int N = 2e5 + 10;
int h[N],e[N],ne[N],idx;

int w[N];

int dp[N][2];

bool has_parent[N];

void add(int a,int b){
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;

}


void dfs(int root){
    dp[root][1] = w[root];
    dp[root][0] = 0;

    for(int i = h[root];i != -1;i = ne[i]){
        int t = e[i];
        dfs(t);
        dp[root][1] += dp[t][0];
        dp[root][0] += max(dp[t][1],dp[t][0]);
    }
}

int main(){

    int n;
    cin>>n;

    for(int i = 1;i <= n;i++){
        cin>>w[i];
    }
    memset(h, -1, sizeof h);
    for(int i = 0;i < n - 1;i++){
        int boss,emp;
        cin>>boss>>emp;
        add(boss,emp);
        has_parent[emp] = true;

    }
    int root = -1;
    for(int i = 1;i <= n;i++){
        if(!has_parent[i]){
            root = i;
            break;
        }
    }

    dfs(root);


    cout<<max(dp[root][1],dp[root][0]);

    return 0;
}