#include<iostream> 
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath> 
#include<algorithm>
#define ll long long 
using namespace std;
const int maxn=5010, inf=1e9+233;
struct edge{int too, pre;}e[maxn<<1];
int n, x, y, tot;
ll f[maxn][maxn][2], g[maxn][2];
int last[maxn], size[maxn], a[maxn];

template<typename T>
inline void read(T &k)
{
    int f=1; k=0; char c=getchar();
    while(c<'0' || c>'9') c=='-'&&(f=-1), c=getchar();
    while(c<='9' && c>='0') k=k*10+c-'0', c=getchar();
    k*=f;
}

inline void add(int x, int y) {e[++tot]=(edge){y, last[x]}; last[x]=tot;}

void dfs(int x, int fa)
{
    size[x]=1;

    if(a[x]>0) f[x][0][0]=a[x];
    else f[x][0][1]=a[x];

    for(int i=last[x], too;i;i=e[i].pre)
        if((too=e[i].too)!=fa)
        {
            dfs(too, x);
            memset(g, 0x3f, sizeof(g));
            for(int j=0;j<size[x];j++)
            {
                for(int k=0;k<=size[too];k++)
                {
                    if(a[x]>0)
                    {
                        g[j+k][0]=min(g[j+k][0], f[x][j][0]+f[too][k][0]);
                        g[j+k][1]=min(g[j+k][1], f[x][j][1]+min(f[too][k][0], f[too][k][1]));
                        g[j+k][1]=min(g[j+k][1], min(f[x][j][0], f[x][j][1])+f[too][k][1]);
                        // if(x==2) printf("x:%d too:%d j:%d k:%d f[too][k][1]:%lld g:%lld\n", x, too, j, k, f[too][k][1], g[j+k][1]);
                    }
                    else g[j+k][1]=min(g[j+k][1], f[x][j][1]+min(f[too][k][1], f[too][k][0]));
                }
            }
            memcpy(f[x], g, sizeof(g));
            size[x]+=size[too];
        }

    for(int i=0;i<size[x];i++) if(f[x][i][1]<0) f[x][i+1][0]=min(f[x][i+1][0], 0ll);//, printf("x:%d qaq\n", x);
    for(int i=0;i<size[x];i++) if(f[x][i][0]<=(ll)(1e13)) f[x][i+1][0]=min(f[x][i+1][0], 0ll);//, printf("x:%d qwq\n", x);
}

int main()
{
    read(n);
    for(int i=1;i<=n;i++) read(a[i]);
    for(int i=1;i<n;i++)
        read(x), read(y), add(x, y), add(y, x);

    memset(f, 0x3f, sizeof(f));
    dfs(1, 0);

    for(int i=0;i<n;i++)
        if(f[1][i][0]<=(ll)(1e13) || f[1][i][1]<0) return printf("%d\n", i), 0;
}
