#include<bits/stdc++.h>
#define Re register
using namespace std;

const int N=2020;

struct Node {
	int u,v,nxt;
}E[2*N];
int cnt,head[N];

int n;
char s[N];
int val[N],dis[N];
int f[N];
int Ans=-1;

inline int rd()
{
	char c=getchar();
	int x=0,f=1;
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}

void add(int x,int y)
{
	Node T={x,y,head[x]};
	E[++cnt]=T;
	head[x]=cnt;
}

void dfs(int u,int fa)
{
	val[u]=s[u]-'0';
	dis[u]=0;
	int Son=-1;
	for(int i=head[u];~i;i=E[i].nxt)
	{
		int ver=E[i].v;
		if(ver==fa) continue;
		dfs(ver,u);
		val[u]+=val[ver];
		dis[ver]+=val[ver];
		dis[u]+=dis[ver];
		if(!(~Son)||dis[Son]<dis[ver]) Son=ver;
	}
	if(!(~Son))
	{
		f[u]=0;
		return;
	}
	if(dis[u]-dis[Son]>=dis[Son]) f[u]=dis[u]/2;
	else f[u]=dis[u]-dis[Son]+min(f[Son]*2,2*dis[Son]-dis[u])/2;
}

int main()
{
	scanf("%d",&n);
	scanf("%s",s+1);
	memset(head,-1,sizeof(head));
	for(Re int i=1;i<n;i++)
	{
		int u=rd();
		int v=rd();
		add(u,v);
		add(v,u);
	}
	for(Re int i=1;i<=n;i++)
	{
		dfs(i,0);
		if(f[i]*2==dis[i])
		{
			if(!(~Ans)) Ans=f[i];
			Ans=min(Ans,f[i]);
		}
	}
	printf("%d",Ans);
	return 0;
}