#include <bits/stdc++.h>
const int N = 1002;
inline void apn(int &a, int b) {
  if (a > b) a = b;
}
inline char get_c() {
  static char buf[20000], *h, *t;
  if (h == t) {
    t = (h = buf) + fread(buf, 1, 20000, stdin);
  }
  return h == t ? EOF : *h++;
}
inline int nxi() {
  int x = 0;
  char c;
  while ((c = get_c()) > '9' || c < '0')
    ;
  while (x = x * 10 + c - 48, (c = get_c()) >= '0' && c <= '9')
    ;
  return x;
}
int main() {
  static int fa[N], hx[N], dp[N][5002];
  int n = nxi();
  for (int i = 2; i <= n; ++i) fa[i] = nxi();
  for (int i = 1; i <= n; ++i) hx[i] = nxi();
  for (int x = n; x; --x) {
    int y = fa[x];
    for (int i = hx[y]; i >= 0; --i) {
      int p = dp[y][i];
      dp[y][i] = 1e5;
      if (hx[x] <= i) {
        dp[y][i] = (hx[x] ? dp[y][i - hx[x]] : p) + dp[x][hx[x]];
      }
      if (dp[x][hx[x]] <= i) {
        apn(dp[y][i], (dp[x][hx[x]] ? dp[y][i - dp[x][hx[x]]] : p) + hx[x]);
      }
    }
  }
  puts(dp[1][hx[1]] >= 1e5 ? "IMPOSSIBLE" : "POSSIBLE");
  return 0;
}
