#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 10;
const int maxb = 5000 + 10;
const int INF = maxn * maxb + 10;
int n, a[maxn], f[maxn][2], dp[maxn][maxb];
vector<int> E[maxn];
void dfs(int x) {
  for (auto v : E[x]) dfs(v);
  for (int k = 0; k < 2; ++k) {
    for (int i = 0; i <= E[x].size(); ++i) fill(dp[i], dp[i] + a[x], INF);
    for (int i = 1; i <= E[x].size(); ++i) {
      int v = E[x][i - 1];
      for (int j = 0; j <= a[x]; ++j) {
        if (j >= a[v])
          dp[i][j] = min(dp[i][j], dp[i - 1][j - a[v]] + f[v][k ^ 1]);
        if (j >= f[v][k])
          dp[i][j] = min(dp[i][j], dp[i - 1][j - f[v][k]] + a[v]);
      }
    }
    f[x][k] = INF;
    for (int j = 0; j <= a[x]; ++j) f[x][k] = min(f[x][k], dp[E[x].size()][j]);
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 2; i <= n; ++i) {
    int v;
    scanf("%d", &v);
    E[v].push_back(i);
  }
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  dfs(1);
  if (min(f[1][0], f[1][1]) < INF)
    puts("POSSIBLE");
  else
    puts("IMPOSSIBLE");
  return 0;
}
