#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
vector<int> g[maxn];
int n, x[maxn];
int dp[maxn][5010], f[5010];
int dfs(int p) {
  dp[p][0] = 0;
  for (auto u : g[p]) {
    int w = dfs(u), v = x[u];
    memcpy(f, dp[p], sizeof(f));
    memset(dp[p], 0x3f3f, sizeof(dp[p]));
    for (int i = 0; i <= x[p]; i++) {
      if (i + w <= x[p]) dp[p][i + w] = min(dp[p][i + w], f[i] + v);
      if (i + v <= x[p]) dp[p][i + v] = min(dp[p][i + v], f[i] + w);
    }
  }
  int ans = dp[0][0];
  for (int i = 0; i <= x[p]; i++) ans = min(dp[p][i], ans);
  return ans;
}
int main() {
  scanf("%d", &n);
  memset(dp, 0x3f3f, sizeof(0x3f3f));
  for (int p, i = 2; i <= n; i++) {
    scanf("%d", &p);
    g[i].push_back(p);
  }
  for (int i = 1; i <= n; i++) scanf("%d", &x[i]);
  int ans = dfs(1);
  if (ans < dp[0][0])
    puts("POSSIBLE");
  else
    puts("IMPOSSIBLE");
  return 0;
}
