#include<algorithm>
#include<cstdio>
#define mxn 100010
using namespace std;
const int inf=1e9;
int n,rt,sl,fh,res,ans,a[mxn],f[mxn],g[mxn],dp[mxn];
int t,h[mxn];
struct Tre
{
	int to,nxt;
}e[mxn<<1];
int rd()
{
	sl=0;fh=1;
	char ch=getchar();
	while(ch<'0'||'9'<ch) {if(ch=='-') fh=-1; ch=getchar();}
	while('0'<=ch&&ch<='9') sl=sl*10+ch-'0',ch=getchar();
	return sl*fh;
}
void add(int u,int v)
{
	e[++t]=(Tre){v,h[u]};h[u]=t;
	e[++t]=(Tre){u,h[v]};h[v]=t;
}
void dfs1(int u,int fa)
{
	int v;f[u]=0;g[u]=a[u];
	for(int i=h[u];i;i=e[i].nxt)
		if((v=e[i].to)!=fa)
		{
			dfs1(v,u);
			f[u]+=f[v]+g[v];
			g[u]+=g[v];
		}
}
void dfs2(int u,int fa)
{
	int v,w=0;dp[u]=0;
	for(int i=h[u];i;i=e[i].nxt)
		if((v=e[i].to)!=fa)
			if(f[v]+g[v]>f[w]+g[w])
				w=v;
	int mx=f[w]+g[w];
	if(mx*2<=f[u]) return (void)(dp[u]=f[u]/2);
	dfs2(w,u);
	dp[u]=f[u]-mx+min(dp[w],(mx*2-f[u])/2);
}
void solve()
{
	dfs1(rt,0);
	if(f[rt]&1) return ;
	dfs2(rt,0);
	if(f[rt]!=dp[rt]*2) return ;
	if(dp[rt]<ans) ans=dp[rt];
}
int main()
{
	n=rd();ans=inf;
	for(int i=1;i<=n;++i) scanf("%1d",a+i);
	for(int i=1;i<n;++i) add(rd(),rd());
	for(int i=1;i<=n;++i) rt=i,solve();
	printf("%d\n",ans<inf?ans:-1);
	return 0;
}