#include<bits/stdc++.h>
using namespace std;
struct node{ //链式前向
int v,next;
}edge[6010];
long long dp[6010][2];
int box[6010],ecnt=1;
bool vis[6010];
int w[6010];
int n,a,b,TLE=(1<<30)-1;
void addedge(int u,int v){
edge[ecnt].v=v;
edge[ecnt].next=box[u];
box[u]=ecnt++; //建边
}
void dfs(int x){
dp[x][0]=w[x];
dp[x][1]=dp[x][2]=0;
for(int i=box[x];i!=0;i=edge[i].next){
int u=edge[i].v;
if(!vis[u]){
vis[u]=1;
dfs(u);
dp[u][0]+=max(dp[u][0],dp[u][1]);
dp[u][1]+=dp[u][0]; //动态转移方程
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=n-1;i++){
cin>>a>>b;
addedge(a,b); addedge(b,a); //存无向边
}
vis[1]=1;
dfs(1);
cout<<min(dp[1][0],dp[1][1])<<endl; //输出
return 0;
}