#include <bits/stdc++.h>
#define fto(i,a,b) for(int i=a; i<=b;++i)
#define fdto(i,a,b) for(int i=a; i>=b;--i)
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define ll long long
#define maxn 5009
#define gb(i,j) ((i>>j)&1)
#define name "a"
#define endl '\n'

using namespace std;
int s[maxn],c[maxn],n;
ll f[maxn][maxn][2],g[maxn][2];
vector<int> a[maxn];
void dfs(int u, int p){
    s[u]=1;
    if(c[u]<0)f[u][0][1]=c[u];
    else f[u][0][0]=c[u];
    for(int v:a[u])
    if(v!=p){
        dfs(v,u);
        fto(i,0,s[u]+s[v]-1)g[i][1]=g[i][0]=1e18;
        for(int i=0; i<=s[v]-1; ++i){
            fdto(j,s[u]-1,0){
                /// cut
                //if(v==2 && i==0) cout <<','<<j<<' '<< f[v][i][1] <<' '<< f[v][i][0]<<endl;
                if(f[v][i][1]<0 || f[v][i][0]<1e18){
                    g[i+j+1][1]=min(g[i+j+1][1],f[u][j][1]);
                    g[i+j+1][0]=min(g[i+j+1][0],f[u][j][0]);
                }
                //if(v==2 && i==0)cout << g[1][1]<<endl;
                /// not cut
                if(f[v][i][0]<1e18){
                    if(f[u][j][0]<1e18)g[i+j][0]=min(g[i+j][0],f[u][j][0]+f[v][i][0]);
                    if(f[u][j][1]<1e18)g[j+i][1]=min(g[i+j][1],f[u][j][1]+f[v][i][0]);
                }
                if(f[v][i][1]<1e18 && min(f[u][j][1],f[u][j][0])<1e18){
                    g[i+j][1]=min(g[i+j][1],f[v][i][1]+min(f[u][j][1],f[u][j][0]));
                }
            }
        }
        s[u]+=s[v];
        //if(u==1)fto(j,0,s[u]-1)cout << g[j][0]<<' '<< g[j][1]<<endl;
        fto(j,0,s[u]-1)
            fto(t,0,1)f[u][j][t]=g[j][t];
        //if(u==4) cout << f[u][1][1]<<endl;
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for(int i=1; i<=n; ++i)cin >> c[i];
    fto(i,2,n){
        int x,y;
        cin >> x >> y;
        a[x].pb(y);
        a[y].pb(x);
    }
    fto(i,1,n)
        fto(j,0,n)
            fto(t,0,1)f[i][j][t]=1e18;
    dfs(1,0);
    int res=n-1;
    //fto(j,1,n){cout << j <<endl;
    //fto(i,0,n-1)cout << f[j][i][0] <<' '<< f[j][i][1]<<endl;
    //}
    fto(i,0,n-1)if(f[1][i][0]<1e18)res=min(res,i);
    fto(i,0,n-1)if(f[1][i][1]<0)res=min(res,i);
    cout << res;
    return 0;
}
