#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
inline bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
int dx[] = {0, 1, -1, 0, 1, -1, 1, -1};
int dy[] = {1, 0, 0, -1, 1, -1, -1, 1};
const long long mod = 1e9 + 7;
const long long INF = -1 * ((1LL << 63) + 1);
const int inf = -1 * ((1 << 31) + 1);
int n;
int v[1005];
vector<vector<int>> g;
int p[1005];
int x[1005];
int f[1005];
int dfs(int now) {
  if (f[now] < 1e9 + 7) return f[now];
  int ret = 1e9 + 7;
  int size = g[now].size();
  vector<vector<int>> dp(size + 1, vector<int>(5005, 1e9 + 7));
  dp[0][0] = 0;
  for (int i = 0; i < size; i++) {
    int next = g[now][i];
    for (int j = 0; j < (x[now] + 1); j++) {
      if (j >= dfs(next)) chmin(dp[i + 1][j], dp[i][j - dfs(next)] + x[next]);
      if (j >= x[next]) chmin(dp[i + 1][j], dp[i][j - x[next]] + dfs(next));
    }
  }
  for (int j = 0; j < (x[now] + 1); j++) ret = min(ret, dp[size][j]);
  return f[now] = ret;
}
int main(void) {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(20);
  cin >> n;
  g.resize(n);
  for (int i = 0; i < (n - 1); i++) {
    int a = i + 1;
    int b;
    cin >> b;
    b--;
    g[b].push_back(a);
  }
  for (int i = 0; i < (n); i++) cin >> x[i];
  for (int i = 0; i < (1001); i++) f[i] = 1e9 + 7;
  if (dfs(0) < 1e9 + 7)
    cout << "POSSIBLE" << endl;
  else
    cout << "IMPOSSIBLE" << endl;
}
