#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<vector<int>> adj(n);
for (int i = 0, u, v; i < n - 1; i++){
cin >> u >> v;
u--, v--;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<int> t(n);
for (int i = 0; i < n; i++){
cin >> t[i];
}
vector<vector<vector<i64>>> dp(2, vector<vector<i64>>(2, vector<i64>(n, 3e5)));
auto dfs = [&](auto &&me, int u, int p) -> void{
for (int v : adj[u]){
if (v == p){
continue;
}
me(me, v, u);
}
for (int tg = 0; tg < 2; tg++){
for (int fl = 0; fl < 2; fl++){
vector<i64> d;
i64 tot = 0;
int chg = t[u] ^ tg ^ fl;
for (int v : adj[u]){
if (v == p){
continue;
}
tot += dp[fl][0][v];
d.push_back(dp[fl][1][v] - dp[fl][0][v]);
}
if (d.empty()){
dp[tg][fl][u] = (chg ? 3e5 : tot) + fl;
continue;
}
sort(d.begin(), d.end());
int take = 0;
i64 ans = 3e5;
while (take < chg){
tot += d[take];
take++;
}
ans = min(ans, tot);
while (take + 1 < d.size()){
tot += d[take] + d[take + 1];
take += 2;
ans = min(ans, tot);
}
dp[tg][fl][u] = ans + fl;
}
}
};
dfs(dfs, 0, 0);
i64 res = min(dp[0][0][0], dp[0][1][0]);
if (res >= 2e5){
cout << "impossible";
}
else{
cout << res;
}
}