#include<bits/stdc++.h>
using namespace std;
#define int long long
constexpr int N=1e5+5,INF=1e18;
int n,p[N],ord[N],_ord;
vector<int> adj[N];
bool f[N];
void dfs_ord(int u){
for(auto&v:adj[u]) if(v!=p[u]){
p[v]=u;
dfs_ord(v);
}
ord[_ord++]=u;
}
signed main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n; cin>>n;
for(int i=0;i<n-1;++i){
int u,v; cin>>u>>v; --u,--v;
adj[u].emplace_back(v);
adj[v].emplace_back(u);
}
for(int i=0;i<n;++i) cin>>f[i];
dfs_ord(0);
int dp[n][2],sa[n]{},sb[n]{};
vector<int> va[n],vb[n];
for(int i=0;i<n;++i){
int u=ord[i];
sort(va[u].begin(),va[u].end());
sort(vb[u].begin(),vb[u].end());
if(va[u].size()){
// on - no flip
int onres=INF;
for(int j=0,run=0;j<(int)vb[u].size();++j){
run+=vb[u][j]+1;
if((j&1) == 0) onres=min(onres,sa[u]+run);
}
// on - flip
for(int j=0,run=0;j<(int)va[u].size();++j){
run+=va[u][j]+1;
if((j&1) == 1) onres=min(onres,sb[u]+run+1);
}
// off - no flip
int offres=INF;
for(int j=0,run=0;j<(int)vb[u].size();++j){
run+=vb[u][j]+1;
if((j&1) == 1) offres=min(offres,sa[u]+run);
}
// off - flip
for(int j=0,run=0;j<(int)va[u].size();++j){
run+=va[u][j]+1;
if((j&1) == 0) offres=min(offres,sb[u]+run+1);
}
// cout<<u<<"= "<<onres<<" "<<offres<<'\n';
dp[u][0]=offres;
dp[u][1]=onres;
}else{
dp[u][0]=0;
dp[u][1]=1;
}
sa[p[u]]+=dp[u][f[u]];
sb[p[u]]+=dp[u][1-f[u]];
va[p[u]].emplace_back(dp[u][f[u]]-dp[u][1-f[u]]);
vb[p[u]].emplace_back(dp[u][1-f[u]]-dp[u][f[u]]);
}
// for(int i=0;i<n;++i) cout<<dp[i][0]<<" "; cout<<'\n';
// for(int i=0;i<n;++i) cout<<dp[i][1]<<" "; cout<<'\n';
// for(int i=0;i<n;++i) cout<<ord[i]<<" "; cout<<'\n';
// cout<<"sa\n";
// for(int i=0;i<n;++i) cout<<sa[i]<<" "; cout<<'\n';
// for(int i=0;i<n;++i) cout<<sb[i]<<" "; cout<<'\n';
// for(int i=0;i<n;++i){ cout<<i<<": "; for(auto&x:va[i]) cout<<x<<" "; cout<<'\n'; }
// for(int i=0;i<n;++i){ cout<<i<<": "; for(auto&x:vb[i]) cout<<x<<" "; cout<<'\n'; }
if(dp[0][f[0]]>n) cout<<"impossible\n";
else cout<<dp[0][f[0]]<<'\n';
return 0;
}