#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000;
int n, x[MAXN + 5], f[MAXN + 5], dp[5 * MAXN + 5];
vector<int> Graph[MAXN + 5];
void dfs(int u) {
  memset(dp, 0x3f, sizeof(dp));
  dp[0] = 0;
  for (int i = 0; i < Graph[u].size(); i++) dfs(Graph[u][i]);
  for (int i = 0; i < Graph[u].size(); i++) {
    int v = Graph[u][i];
    for (int j = x[u]; j >= 0; j--) {
      int tmp = 0x3f3f3f3f;
      if (j >= x[v]) tmp = min(tmp, dp[j - x[v]] + f[v]);
      if (j >= f[v]) tmp = min(tmp, dp[j - f[v]] + x[v]);
      dp[j] = tmp;
    }
  }
  for (int i = x[u]; i >= 0; i--) f[u] = min(f[u], dp[i]);
}
int main() {
  scanf("%d", &n);
  for (int i = 2, fa; i <= n; i++) {
    scanf("%d", &fa);
    Graph[fa].push_back(i);
  }
  for (int i = 1; i <= n; i++) scanf("%d", &x[i]);
  memset(f, 0x3f, sizeof(f));
  dfs(1);
  puts(f[1] < 0x3f3f3f3f ? "POSSIBLE" : "IMPOSSIBLE");
  return 0;
}
