#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#include <iomanip>
#define MOD 1000000007
typedef long long ll;
using namespace std;

int N;
ll A[5050];
vector<int> g[5050];

ll dp[5050][5050][2];
ll memo[5050][2];
int num[5050];
const ll INF=1e18;

void dfs(int now,int par){
  for(int next:g[now]){
    if(next==par) continue;
    dfs(next,now);
  }

  int sum=1;
  if(A[now]<0) dp[now][0][1]=A[now];
  else dp[now][0][0]=A[now];

  for(int next:g[now]){
    if(next==par) continue;
    for(int i=0;i<sum;i++){
      for(int j=0;j<num[next];j++){
        for(int k=0;k<2;k++){
          for(int l=0;l<2;l++){
            memo[i+j][k|l]=min(memo[i+j][k|l],dp[now][i][k]+dp[next][j][l]);

            if(dp[next][j][l]<0||(l==0&&dp[next][j][l]<INF)){
              memo[i+j+1][k]=min(memo[i+j+1][k],dp[now][i][k]);
            }
          }
        }
      }
    }

    sum+=num[next];
    for(int i=0;i<sum;i++){
      for(int k=0;k<2;k++){
        dp[now][i][k]=memo[i][k];
        memo[i][k]=INF;
      }
    }
  }
  num[now]=sum;
}

int main(){
  cin>>N;
  for(int i=0;i<N;i++) cin>>A[i];
  for(int i=1;i<N;i++){
    int u,v;
    cin>>u>>v;
    u--;v--;
    g[u].push_back(v);
    g[v].push_back(u);
  }

  for(int i=0;i<=N;i++){
    for(int k=0;k<2;k++){
      for(int j=0;j<=N;j++){
        dp[i][j][k]=INF;
      }
      memo[i][k]=INF;
    }
  }

  dfs(0,-1);

  int ans=N-1;
  for(int i=0;i<N;i++){
    if(dp[0][i][0]<INF) ans=min(ans,i);
    if(dp[0][i][1]<0) ans=min(ans,i);
  }
  cout<<ans<<endl;

  return 0;
}