#include <bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define s second
signed main(){
int n; cin >> n;
vector<int> s(n+1, 0);
vector<vector<int>> al(n+1);
for(int i=0;i<n-1;i++){
int a,b;cin>>a>>b;
al[a].push_back(b);
al[b].push_back(a);
}
for(int i=1;i<=n;i++)cin>>s[i];
vector<array<array<int,2>,2>> dp(n+1);
for(int i=0;i<=n;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
dp[i][j][k]=INT_MAX;
}
}
}
auto solve=[&](vector<array<int,2>> v)->array<int,2>{ int nc=v.size();
sort(v.begin(),v.end(), [&](auto a, auto b){
return a[1] - a[0] < b[1] - b[0];
});
int sm=0, run=0;
array<int, 2> d={0,INT_MAX};
for(int i=0;i<nc;i++){
sm += v[i][0];
run += v[i][1] - v[i][0];
d[(i+1)%2] = min(d[(i+1)%2], run);
}
return array<int,2>{sm+d[0], sm+d[1]};
};
/*vector<array<int, 2>> temp={{100000, 2}};
auto [a, b] = solve(temp);
cout<<a<<" "<<b<<endl;*/
auto dfs=[&](auto && dfs, int x, int p)->void{
array<vector<array<int,2>>, 2> ch;
int nc=0;
for(auto it : al[x]){
if(it==p)continue;
nc++;
dfs(dfs, it, x);
ch[0].push_back(dp[it][0]);
ch[1].push_back(dp[it][1]);
}
if(nc){
array<int, 2> res0, res1;
res0=solve(ch[0]);
res1=solve(ch[1]);
dp[x][s[x]][0]=res0[0];
dp[x][s[x]^1][0]=res0[1];
dp[x][s[x]^1][1]=res1[0]+1;
dp[x][s[x]][1]=res1[1]+1;
}
else {
dp[x][s[x]][0]=0;
dp[x][!s[x]][1]=1;
}
/*cout<<x<<endl;
cout<<dp[x][0][0]<<" "<<dp[x][0][1]<<endl;
cout<<dp[x][1][0]<<" "<<dp[x][1][1]<<endl;*/
};
dfs(dfs, 1, 0);
int ans=min(dp[1][0][0], dp[1][0][1]);
if(ans > INT_MAX / 2){
cout<<"impossible";
}
else cout<<ans;
}