#include <bits/stdc++.h>
using namespace std;
const int N = 1005, M = 5005, inf = 1e8;
int n, i, lt[N], he[N], a[N];
int fx[N], fy[N], gx[M], gy[M];
int read() {
  char c = getchar();
  int k = 0;
  for (; c < 48 || c > 57; c = getchar())
    ;
  for (; c > 47 && c < 58; c = getchar()) k = (k << 3) + (k << 1) + c - 48;
  return k;
}
void gmax(int &x, int k) {
  if (k > x) x = k;
}
void cal(int x) {
  int i, m = a[x], sum = 0;
  for (i = 0; i <= m; i++) gx[i] = gy[i] = 0;
  for (int y = he[x]; y; y = lt[y]) {
    int v = a[y], vx = fx[y], vy = fy[y];
    sum += v;
    int kx = a[y] - vx, ky = a[y] - vy;
    for (i = m; i && gx[i] >= 0; i--)
      gx[i] = max(-inf, max(i >= v ? gx[i - v] + kx : -inf,
                            i >= vy ? gx[i - vy] : -inf));
    for (i = m; i && gy[i] >= 0; i--)
      gy[i] = max(-inf, max(i >= v ? gy[i - v] + ky : -inf,
                            i >= vx ? gy[i - vx] : -inf));
  }
  fx[x] = min(inf, sum - gx[m]);
  fy[x] = min(inf, sum - gy[m]);
}
int main() {
  for (n = read(), i = 2; i <= n; i++) {
    int x = read();
    lt[i] = he[x];
    he[x] = i;
  }
  for (i = 1; i <= n; i++) a[i] = read();
  for (i = n; i; i--) cal(i);
  puts(fx[1] < inf || fy[1] < inf ? "POSSIBLE" : "IMPOSSIBLE");
}
