#include <bits/stdc++.h>
using namespace std;
#define int long long
vector<vector<int>> mem, adjlist;
vector<int> done;
int dp(int n, int p, int flag) {
if (mem[n][flag] != -1) return mem[n][flag];
int pa = done[n] ^ (flag & 1) ^ (flag >> 1), numf = 0, ans = (flag >> 1), mindiff = INT_MAX;
if ((adjlist[n].size() == 1 && adjlist[n][0] == p) || adjlist[n].empty()) {
if (pa) return mem[n][flag] = INT_MAX;
return mem[n][flag] = (flag >> 1);
}
for (int i : adjlist[n]) {
if (i == p) continue;
int res1 = dp(i, n, (flag & 2) >> 1);
int res2 = dp(i, n, ((flag & 2) >> 1) + 2);
if (res2 < res1) numf++;
ans += min(res1, res2);
mindiff = min(mindiff, abs(res1 - res2));
}
if ((numf & 1) != pa) ans += mindiff;
return mem[n][flag] = ans;
}
signed main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int N, a, b; cin >> N;
adjlist.resize(N, vector<int>());
done.resize(N, 0);
mem.resize(N, vector<int>(4, -1));
for (int i = 0; i < N - 1; i++) {
cin >> a >> b; a--, b--;
adjlist[a].push_back(b);
adjlist[b].push_back(a);
}
for (int i = 0; i < N; i++) {
cin >> a;
done[i] = a;
}
int res = min(dp(0, -1, 0), dp(0, -1, 2));
if (res >= INT_MAX) cout << "impossible\n";
else cout << res << '\n';
}