#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 50;
const int inf = 0x3f3f3f3f;
template <typename T>
void Read(T& x) {
  x = 0;
  char ch;
  for (ch = getchar(); ch < '0' || ch > '9'; ch = getchar())
    ;
  for (; ch <= '9' && ch >= '0'; ch = getchar()) x = x * 10 + ch - '0';
}
int n, f[1001][5005], x[maxn], g[5005], temp[5005];
vector<int> Edge[maxn];
void Dfs(int u) {
  for (auto&& v : Edge[u]) Dfs(v);
  memset(g, 0x3f, sizeof(g));
  g[0] = 0;
  for (auto&& v : Edge[u]) {
    memset(temp, 0x3f, sizeof(temp));
    for (int i = 0; i <= 5000; ++i)
      if (g[i] <= 5000)
        for (int j = 0; j + i <= 5000; ++j)
          if (f[v][j] + g[i] <= 5000)
            temp[i + j] = min(temp[i + j], g[i] + f[v][j]);
    memcpy(g, temp, 5001 << 2);
  }
  memset(temp, 0x3f, sizeof(temp));
  for (int i = 0; i <= 5000; ++i)
    if (g[i] != inf) {
      if (i <= x[u]) temp[x[u]] = min(temp[x[u]], g[i]);
      if (g[i] <= x[u]) temp[i] = min(temp[i], x[u]);
    }
  memcpy(f[u], temp, 5001 << 2);
}
int main(int argc, char* argv[]) {
  Read(n);
  for (int i = 2; i <= n; ++i) {
    int fa;
    Read(fa);
    Edge[fa].emplace_back(i);
  }
  for (int i = 1; i <= n; ++i) Read(x[i]);
  Dfs(1);
  for (int i = 0; i <= 5000; ++i)
    if (f[1][i] != inf) {
      puts("POSSIBLE");
      return 0;
    }
  puts("IMPOSSIBLE");
  return 0;
}
