#include <bits/stdc++.h>
using namespace std;

const int N = 1010;
const int inf = 1e9 + 7;

int n, x[N], ch[N];
int f[N][5010], g[N][5010];
vector<int> G[N];

void dfs(int u) {
	ch[u] = 1;
	for (int i = 1; i <= x[u]; ++i) f[u][i] = inf;
	for (int v: G[u]) {
		dfs(v);
		ch[u] += ch[v];
		for (int j = 0; j <= x[u]; ++j) g[u][j] = inf;
		for (int j = 0; j <= x[u]; ++j) {
			if (j >= f[v][x[v]]) g[u][j] = min(g[u][j], f[u][j - f[v][x[v]]] + x[v]);
			if (j >= x[v]) g[u][j] = min(g[u][j], f[u][j - x[v]] + f[v][x[v]]);
		}
		for (int j = 0; j <= x[u]; ++j) f[u][j] = g[u][j];
	}
	if (ch[u] == 1) {
		f[u][x[u]] = 0;
		for (int i = 0; i < x[u]; ++i) f[u][i] = inf;
		return;
	}
	for (int j = 0; j <= x[u] - 1; ++j) f[u][x[u]] = min(f[u][x[u]], f[u][j]);

	if (f[u][x[u]] == inf) {
		printf("IMPOSSIBLE\n");
		exit(0);
	}
}

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);
	cin >> n;
	for (int i = 2; i <= n; ++i) {
		int p; cin >> p;
		G[p].push_back(i);
	}
	for (int i = 1; i <= n; ++i) cin >> x[i];

	dfs(1);

	printf("POSSIBLE\n");
}