#include<bits/stdc++.h>
#define N 5005
#define inf N*N
#define _to e[i].to
using namespace std;

struct edge{
	int to,_next;
}e[N<<1];
int head[N],size,ans=inf;
void add(int from,int to){
	e[++size].to=to,e[size]._next=head[from],head[from]=size;
}

int f[N],dis[N],a[N],n,x,y,sz[N];

void dfs(int k,int fa){
	int mx=0;
	for(int i=head[k];i;i=e[i]._next)
		if(_to!=fa)
			dfs(_to,k),sz[k]+=sz[_to],dis[_to]+=sz[_to],dis[k]+=dis[_to],mx=dis[mx]<dis[_to]?_to:mx;
	if(!mx)return (void)(f[k]=0);
	if(dis[k]>=dis[mx]*2)f[k]=dis[k]/2;
	else f[k]=dis[k]-dis[mx]+min(f[mx],dis[mx]*2-dis[k]);
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%1d",&a[i]);
	for(int i=1;i<n;i++)
		scanf("%d%d",&x,&y),add(x,y),add(y,x);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)
			dis[j]=f[j]=0,sz[j]=a[j];
		dfs(i,0);
		if(dis[i]&1)continue;
		if(f[i]*2>=dis[i])ans=min(ans,dis[i]/2);
	}
	printf("%d",(ans==inf)?-1:ans);
	return 0;
}