#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n, p, ans = 0, top[N], xx[N], f[2][N], sum[N];
struct lol {
  int x, y;
} e[N << 1];
void freo() {
  freopen(".in", "r", stdin);
  freopen(".out", "w", stdout);
}
void ein(int x, int y) {
  e[++ans] = (lol){top[x], y};
  top[x] = ans;
}
void init() {
  scanf("%d", &n);
  for (int i = 1; ++i <= n; scanf("%d", &p), ein(p, i))
    ;
  for (int i = 0; ++i <= n; scanf("%d", &xx[i]))
    ;
}
void dfs(int x) {
  for (int i = top[x], y; i; y = e[i].y, dfs(y), i = e[i].x)
    ;
  int cnt = 0;
  memset(f[0], 0x3f, sizeof(f[0]));
  f[0][0] = 0;
  for (int i = top[x], y; i; i = e[i].x) {
    y = e[i].y;
    cnt ^= 1;
    memset(f[cnt], 0x3f, sizeof(f[cnt]));
    for (int j = -1; ++j <= xx[x];
         j < xx[y]
             ?: f[cnt][j] = min(f[cnt][j], f[cnt ^ 1][j - xx[y]] + sum[y]),
             j < sum[y]
                 ?: f[cnt][j] = min(f[cnt][j], f[cnt ^ 1][j - sum[y]] + xx[y]))
      ;
  }
  for (int i = -1; ++i <= xx[x]; sum[x] = min(sum[x], f[cnt][i]))
    ;
}
void work() {
  memset(sum, 0x3f, sizeof(sum));
  dfs(1);
}
void prin() { printf(sum[1] == 0x3f3f3f3f ? "IMPOSSIBLE" : "POSSIBLE"); }
int main() {
  init();
  work();
  prin();
  return 0;
}
