#include <cstdio>

inline int min(int a,int b){
	return a<b?a:b;
}

const int inf=1e9;

const int N=2e3+5;

char s[N];

int n,h[N],edge_cnt,sz[N],f[N],ans=inf;

struct Edge{
	int to,nex;
}e[N<<1];

inline void add_edge(int u,int v){
	e[++edge_cnt]=(Edge){v,h[u]};
	h[u]=edge_cnt;
}

void dfs(int u,int pre){
	sz[u]=(s[u]=='1');
	f[u]=0;
	for(int i=h[u];i;i=e[i].nex){
		int v=e[i].to;
		if(v!=pre){
			dfs(v,u);
			sz[u]+=sz[v];
			f[u]+=f[v]+sz[v];
		}
	}
}

int dp(int u,int pre){
	int mx_id=0,mx_n=0;
	for(int i=h[u];i;i=e[i].nex){
		int v=e[i].to;
		if(v!=pre){
			if(!mx_id||f[v]+sz[v]>mx_n){
				mx_id=v;
				mx_n=f[v]+sz[v];
			}
		}
	}
	if(f[u]-mx_n>=mx_n){
		return f[u]&1;
	}
	int d=dp(mx_id,u)+sz[mx_id];
	if(f[u]-mx_n>=d){
		return f[u]&1;
	}else{
		return d-(f[u]-mx_n);
	}
}

int main(){
	scanf("%d%s",&n,s+1);
	for(int i=1,u,v;i<n;++i){
		scanf("%d%d",&u,&v);
		add_edge(u,v);
		add_edge(v,u);
	}
	for(int u=1;u<=n;++u){
		dfs(u,0);
		if(dp(u,0)==0){
			ans=min(ans,f[u]/2);
		}
	}
	printf("%d\n",ans==inf?-1:ans);
	return 0;
}