#include <bits/stdc++.h>
using namespace std;
vector<int> pth[1010];
int val[1010];
struct ei {
  int a, b;
  ei operator+(const ei &aa) const;
};
ei ei::operator+(const ei &aa) const { return ei{a + aa.a, b + aa.b}; }
int mic[1010][2];
ei ee[1010][2];
int dep(int idx, int col) {
  if (mic[idx][col] != -1) return mic[idx][col];
  ei iB = ei{0, 0};
  ei iW = ei{0, 0};
  for (int i = 0; i < (int)pth[idx].size(); i++) {
    int b = dep(pth[idx][i], 0);
    int w = dep(pth[idx][i], 1);
    if (b == 0 && w == 0) {
      return mic[idx][0] = mic[idx][1] = 0;
    } else if (b == 0) {
      iB = iB + ee[pth[idx][i]][1];
      iW = iW + ee[pth[idx][i]][1];
    } else if (w == 0) {
      iB = iB + ee[pth[idx][i]][0];
      iW = iW + ee[pth[idx][i]][0];
    } else {
      if (ee[pth[idx][i]][0].a < ee[pth[idx][i]][1].a) {
        iB = iB + ee[pth[idx][i]][0];
      } else {
        iB = iB + ee[pth[idx][i]][1];
      }
      if (ee[pth[idx][i]][0].b < ee[pth[idx][i]][1].b) {
        iW = iW + ee[pth[idx][i]][0];
      } else {
        iW = iW + ee[pth[idx][i]][1];
      }
    }
  }
  mic[idx][0] = (iB.a <= val[idx]);
  mic[idx][1] = (iW.b <= val[idx]);
  iB.a = val[idx];
  iW.b = val[idx];
  ee[idx][0] = iB;
  ee[idx][1] = iW;
  return mic[idx][col];
}
int main() {
  int n;
  scanf("%d", &n);
  int x;
  for (int i = 2; i <= n; i++) {
    scanf("%d", &x);
    pth[x].push_back(i);
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d", &val[i]);
  }
  memset(mic, -1, sizeof(mic));
  printf("%sPOSSIBLE\n", (dep(1, 0) || dep(1, 1)) ? "" : "IM");
}
