#include<bits/stdc++.h>
using namespace std;
#define M 2005
struct edge{
    int t,nxt;
}e[M*2];
int head[M],tot;
void add(int st,int t) {
    e[++tot].nxt=head[st],e[tot].t=t,head[st]=tot;
}
int n,ans=1e9;
char s[M];
int dis[M],dis2[M],sz[M];
void dfs(int x,int fa) {
    sz[x]=(s[x]=='1');
    int d1,d2=-1;
    for(int i=head[x];i;i=e[i].nxt)
	{
	    int to=e[i].t;
	    if(to==fa) continue ;
	    dfs(to,x);
	    dis[x]+=dis[to]+sz[to];
	    sz[x]+=sz[to];
	    dis2[x]+=dis2[to]+sz[to];
	    if(d2<dis2[to]+sz[to]) d1=dis[to]+sz[to],d2=dis2[to]+sz[to];
	}
    if(d2!=-1)
	{
	    if(d2<=dis2[x]-d2)
		{
		    if(dis2[x]&1) dis2[x]=1;
		    else dis2[x]=0;
		}
	    else
		{
		    int res=2*d2-dis2[x],res2=(dis[x]-d1)-(dis2[x]-d2);
		    if(res&1)
			{
			    if(res-1<=res2) dis2[x]=1;
			    else dis2[x]=res-res2;
			}
		    else
			{
			    if(res<=res2) dis2[x]=0;
			    else dis2[x]=res-res2;
			}
		}
	}
}
void work() {
    for(int i=1;i<=n;i++)
	{
	    memset(dis,0,sizeof(dis));
	    memset(dis2,0,sizeof(dis2));
	    memset(sz,0,sizeof(sz));
	    dfs(i,0);
	    if(dis2[i]) continue ;
	    ans=min(ans,dis[i]/2);
	}
    if(ans==1e9) cout<<-1<<'\n';
    else cout<<ans<<'\n';
}
int main()
{
    cin>>n;
    scanf("%s",s+1);
    for(int i=1,x,y;i<n;i++)
	{
	    cin>>x>>y;
	    add(x,y),add(y,x);
	}
    work();
    return 0;
}