#include <bits/stdc++.h>
using namespace std;
#define MAXN 100001
#define int long long
int n;
vector<int> adj[MAXN];
int state[MAXN];
int dp[2][2][MAXN];
void dfs(int node,int pret)
{
if ((int)adj[node].size()==1 and node!=1)
{
if (state[node]==0)
{
dp[0][0][node]=0;dp[0][1][node]=INT_MAX;
dp[1][0][node]=INT_MAX;dp[1][1][node]=1;
}
else
{
dp[0][0][node]=INT_MAX;dp[0][1][node]=0;
dp[1][0][node]=1;dp[1][1][node]=INT_MAX;
}
return;
}
for (int sled:adj[node])
{
if (sled!=pret) dfs(sled,node);
}
if (state[node]==0)
{
int children=0;
int brupaljenih=0,minrazlika=INT_MAX;
for (int sled:adj[node])
{
if (sled==pret) continue;
children+=min(dp[0][0][sled],dp[1][0][sled]);
if (dp[1][0][sled]<dp[0][0][sled]) brupaljenih++;
else minrazlika=min(minrazlika,dp[1][0][sled]-dp[0][0][sled]);
}
if (brupaljenih%2==0) {dp[0][0][node]=children;dp[0][1][node]=min(children+minrazlika,(long long)INT_MAX);}
else {dp[0][0][node]=min(children+minrazlika,(long long)INT_MAX);dp[0][1][node]=children;}
children=0;
brupaljenih=0,minrazlika=INT_MAX;
for (int sled:adj[node])
{
if (sled==pret) continue;
children+=min(dp[0][1][sled],dp[1][1][sled]);
if (dp[1][1][sled]<dp[0][1][sled]) brupaljenih++;
else minrazlika=min(minrazlika,dp[1][1][sled]-dp[0][1][sled]);
}
if (brupaljenih%2==0) {dp[1][0][node]=min(1+children+minrazlika,(long long)INT_MAX);dp[1][1][node]=1+children;}
else {dp[1][0][node]=1+children;dp[1][1][node]=min(1+children+minrazlika,(long long)INT_MAX);}
}
else
{
int children=0;
int brupaljenih=0,minrazlika=INT_MAX;
for (int sled:adj[node])
{
if (sled==pret) continue;
children+=min(dp[0][0][sled],dp[1][0][sled]);
if (dp[1][0][sled]<dp[0][0][sled]) brupaljenih++;
else minrazlika=min(minrazlika,dp[1][0][sled]-dp[0][0][sled]);
}
if (brupaljenih%2==0) {dp[0][0][node]=min(children+minrazlika,(long long)INT_MAX);dp[0][1][node]=children;}
else {dp[0][0][node]=children;dp[0][1][node]=min(children+minrazlika,(long long)INT_MAX);}
children=0;
brupaljenih=0,minrazlika=INT_MAX;
for (int sled:adj[node])
{
if (sled==pret) continue;
children+=min(dp[0][1][sled],dp[1][1][sled]);
if (dp[1][1][sled]<dp[0][1][sled]) brupaljenih++;
else minrazlika=min(minrazlika,dp[1][1][sled]-dp[0][1][sled]);
}
if (brupaljenih%2==0) {dp[1][0][node]=1+children;dp[1][1][node]=min(1+children+minrazlika,(long long)INT_MAX);}
else {dp[1][0][node]=min(1+children+minrazlika,(long long)INT_MAX);dp[1][1][node]=1+children;}
}
}
int32_t main()
{
cin>>n;for (int i=1;i<n;i++) {int u,v;cin>>u>>v;adj[u].push_back(v);adj[v].push_back(u);}
for (int node=1;node<=n;node++) cin>>state[node];
dfs(1,0);int answer=min(dp[0][0][1],dp[1][0][1]);
if (answer==INT_MAX) cout<<"impossible"<<endl;
else cout<<answer<<endl;
}