#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
inline void chmin(int &x, int y) {
  if (x > y) x = y;
}
int N;
int dp[1010];
int p[1010];
vector<int> g[1010];
int x[1010];
int dp2[5010];
int main() {
  cin >> N;
  for (int i = 0; i < (N); i++) dp[i] = INF;
  for (int i = 0; i < (N - 1); i++) {
    cin >> p[i + 1];
    --p[i + 1];
    g[p[i + 1]].push_back(i + 1);
  }
  for (int i = 0; i < (N); i++) cin >> x[i];
  for (int i = N - 1; i >= 0; --i) {
    if (g[i].size() == 0) {
      dp[i] = 0;
    } else {
      for (int j = 0; j < (5010); j++) dp2[j] = INF;
      for (int j = 0; j < (g[i].size()); j++) {
        int to = g[i][j];
        if (j == 0) {
          dp2[x[to]] = dp[to];
          if (dp[to] < 5010) {
            chmin(dp2[dp[to]], x[to]);
          }
        } else {
          for (int k = 0; k < (5010); k++)
            if (dp2[k] < 5010) {
              if (k + x[to] < 5010) {
                chmin(dp2[k + x[to]], dp2[k]);
              }
              if (dp2[k] + x[to] < 5010) {
                chmin(dp2[dp2[k] + x[to]], k);
              }
            }
        }
      }
      for (int k = 0; k < (5010); k++)
        if (dp2[k] < 5010) {
          if (k <= x[i]) {
            chmin(dp[i], dp2[k]);
          }
          if (dp2[k] <= x[i]) {
            chmin(dp[i], k);
          }
        }
    }
  }
  puts(dp[0] != INF ? "POSSIBLE" : "IMPOSSIBLE");
  return 0;
}
