#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
int f[N], dp[N], x[N];
vector<int> edge[N];
void dfs(int u) {
  for (int i = 0; i < edge[u].size(); i++) dfs(edge[u][i]);
  memset(dp, 0x3f, sizeof(dp));
  dp[0] = 0;
  for (int i = 0; i < edge[u].size(); i++) {
    int v = edge[u][i];
    for (int j = x[u]; j >= 0; j--) {
      if (j - f[v] >= 0) dp[j] = min(dp[j], dp[j - f[v]] + x[v]);
      if (j - x[v] >= 0) dp[j] = min(dp[j], dp[j - x[v]] + f[v]);
    }
  }
  for (int i = 1; i <= x[u]; i++) f[u] = min(f[u], dp[i]);
}
int main() {
  int n, pre;
  scanf("%d", &n);
  for (int i = 2; i <= n; i++) scanf("%d", &pre), edge[pre].push_back(i);
  for (int i = 1; i <= n; i++) scanf("%d", x + i);
  memset(f, 0x3f, sizeof(f));
  dfs(1);
  if (f[1] >= 0x3f3f3f3f)
    puts("IMPOSSIBLE");
  else
    puts("POSSIBLE");
  return 0;
}
