#include "iostream"
#include "algorithm"
#include "cstring"
#include "cstdio"
#include "vector"
using namespace std;
#define MAXN 2016
#define P 1000000007
int n;
vector<int> G[MAXN];
int A[MAXN] , F[MAXN] , d[MAXN] , s[MAXN] , siz[MAXN] , S;
void dfs( int u , int fa ) {
    if( A[u] ) s[u] = d[u] , siz[u] = 1; else siz[u] = s[u] = 0;
    int mxp = 0;
    for( int v : G[u] ) if( v != fa ) {
        d[v] = d[u] + 1 , dfs( v , u ) , s[u] += s[v] , siz[u] += siz[v];
        mxp = ( !mxp || s[v] > s[mxp] ) ? v : mxp;
    }
    int sum = s[u] - siz[u] * d[u] , mx = s[mxp] - siz[mxp] * d[u];
    if( sum >= 2 * mx ) F[u] = sum / 2;
    else
        F[u] = sum - mx + min( F[mxp] , ( 2 * mx - sum ) / 2 );
}
int main() {
    cin >> n;
    for( int i = 1 ; i <= n ; ++ i ) scanf("%1d",&A[i]);
    for( int i = 1 , u , v ; i < n ; ++ i ) {
        scanf("%d%d",&u,&v);
        G[u].push_back( v ) , G[v].push_back( u );
    }
    int res = 0x3f3f3f3f;
    for( int i = 1 ; i <= n ; ++ i ) {
        d[i] = 0, dfs( i , i );
        if( ( ~s[i] & 1 ) && F[i] == s[i] / 2 ) res = min( res , s[i] / 2 );
    }
    cout << ( res == 0x3f3f3f3f ? -1 : res ) << endl;
}
