#include <bits/stdc++.h>

using namespace std;

struct edge
{
	int v,nxt;
}e[4050];

int ecnt,head[2050];

void adde(int u,int v)
{
	e[++ ecnt].v = v;
	e[ecnt].nxt = head[u];
	head[u] = ecnt;
}

int sz[2050],lft[2050],dist[2050];
char str[2050];
int n;

void dfs(int pos,int lst)
{
	sz[pos] = str[pos] == '1' ? 1 : 0;
	dist[pos] = 0;
	int maxn = 0;
	for(int i = head[pos];i;i = e[i].nxt)
	{
		int v = e[i].v;
		if(v != lst)
		{
			dfs(v,pos);
			sz[pos] += sz[v];
			dist[pos] += dist[v] + sz[v];
			lft[v] += sz[v];
			if(lft[v] > lft[maxn]) maxn = v;
		}
	}
	if(!maxn) lft[pos] = 0;
	else
	{
		int tot = dist[pos] - dist[maxn] - sz[maxn];
		if(tot >= lft[maxn]) lft[pos] = dist[pos] & 1;
		else lft[pos] = lft[maxn] - tot;
	}
}

int main()
{
	scanf("%d %s",&n,str + 1);
	for(int i = 1;i < n; ++ i)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		adde(u,v),adde(v,u);
	}
	lft[0] = -0x3f3f3f3f;
	int ans = 0x3f3f3f3f;
	for(int i = 1;i <= n; ++ i)
	{
		dfs(i,0);
		if(lft[i] == 0)
			ans = min(ans,dist[i] / 2);
	}
	if(ans == 0x3f3f3f3f) printf("-1\n");
	else printf("%d\n",ans);
	return 0;
}