#include <bits/stdc++.h>
using namespace std;
const int mxn = 1024;
int T, n, m, ax[mxn], head[mxn], f[mxn], a[mxn], b[mxn], g[mxn][8192];
struct ed {
  int to, nxt;
} edge[mxn << 1];
void addedge(int u, int v) { edge[++m] = (ed){v, head[u]}, head[u] = m; }
void dfs(int u, int fa) {
  for (int i = head[u], v; i; i = edge[i].nxt)
    if ((v = edge[i].to) != fa) dfs(v, u);
  memset(g[1], 0x3f, sizeof(g[1])), m = g[1][0] = 0;
  for (int i = head[u], v; i; i = edge[i].nxt)
    if ((v = edge[i].to) != fa) a[++m] = f[v], b[m] = ax[v];
  for (int i = 1; i <= m && (memset(g[i + 1], 0x3f, sizeof(g[i + 1])), 1); ++i)
    for (int j = 0; j <= ax[u]; ++j) {
      if (j + a[i] <= ax[u])
        g[i + 1][j + a[i]] = min(g[i + 1][j + a[i]], g[i][j] + b[i]);
      if (j + b[i] <= ax[u])
        g[i + 1][j + b[i]] = min(g[i + 1][j + b[i]], g[i][j] + a[i]);
    }
  for (int i = ax[u]; i >= 0; --i) f[u] = min(f[u], g[m + 1][i]);
}
int main() {
  for (int i = (scanf("%d", &n), 2), x; i <= n; ++i)
    scanf("%d", &x), addedge(i, x), addedge(x, i);
  for (int i = 1; i <= n; ++i) scanf("%d", &ax[i]);
  dfs(1, 0), puts(f[1] < 0x3f3f3f3f ? "POSSIBLE" : "IMPOSSIBLE");
  return 0;
}
