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

const int Maxn = 2005;
int n, cnt, head[Maxn];
long long sum[Maxn], w[Maxn];
string str;
long long ans = 0x3f3f3f3f3f3f3f3fLL;
struct edg
{
	int nxt, to;
}edge[2 * Maxn];
void add(int x, int y)
{
	edge[++cnt] = (edg){head[x], y};
	head[x] = cnt;
}
void dfs1(int u, int fa)
{
	sum[u] = w[u] = 0;
	if (str[u - 1] == '1') w[u] = 1;
	for (int i = head[u]; i; i = edge[i].nxt)
	{
		int to = edge[i].to;
		if (to != fa)
			dfs1(to, u), w[u] += w[to], sum[u] += sum[to] + w[to];
	}
}
long long dfs2(int u, int fa)
{
	for (int i = head[u]; i; i = edge[i].nxt)
	{
		int to = edge[i].to;
		if (to != fa && (sum[to] + w[to]) * 2 > sum[u])
				return max(0LL, dfs2(to, u) + 2 * w[to] - sum[u] + sum[to]);
	}
	return 0;
}
int main()
{
	scanf("%d", &n);
	cin >> str;
	for (int i = 1; i < n; i++)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		add(x, y), add(y, x);
	}
	for (int i = 1; i <= n; i++)
	{
		dfs1(i, 0);
		if (!(sum[i] & 1) && !dfs2(i, 0))
			ans = min(ans, sum[i] / 2);
	}
	if (ans == 0x3f3f3f3f3f3f3f3fLL)
		puts("-1");
	else printf("%lld", ans);
	return 0;
}