#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
int n, head[1000 + 5], cnt, X[1000 + 5], g[1000 + 5],
    flag = 1, f[1000 + 5][5005], F[1000 + 5][5005], sum[1000 + 5];
struct edge {
  int to, next;
} e[1000 + 5];
inline void ins(int f, int t) {
  e[++cnt] = (edge){t, head[f]};
  head[f] = cnt;
}
void dfs(int x) {
  f[x][0] = 1;
  for (int i = head[x]; i; i = e[i].next)
    dfs(e[i].to), sum[x] += X[e[i].to] + g[e[i].to];
  for (int i = head[x]; i; i = e[i].next) {
    for (int j = X[x]; ~j; --j) {
      if (j + X[e[i].to] <= X[x]) F[x][j + X[e[i].to]] |= f[x][j];
      if (j + g[e[i].to] <= X[x]) F[x][j + g[e[i].to]] |= f[x][j];
    }
    for (int j = 0; j <= X[i]; ++j) f[x][j] = F[x][j], F[x][j] = 0;
  }
  for (int k = X[x]; ~k; --k)
    if (f[x][k]) return (void)(g[x] = sum[x] - k);
  flag = 0;
}
int main() {
  n = read();
  for (int i = 2; i <= n; ++i) ins(read(), i);
  for (int i = 1; i <= n; ++i) X[i] = read();
  dfs(1);
  puts(flag ? "POSSIBLE" : "IMPOSSIBLE");
  return 0;
}
