#include <bits/stdc++.h>
using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;

typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

// order statistics tree
typedef tree<pii, null_type, less<pii>, rb_tree_tag,
             tree_order_statistics_node_update> indexed_set;

#define F first
#define S second
#define PB push_back
#define MP make_pair

#define rep(i, a, total_black) for(int i = a; i < (total_black); ++i)
#define trav(a, x) for(auto& a : x)
#define all(x) x.begin(), x.end()
#define sz(x) (int)(x).size()

const int N = 1001;
const int INF = 1e9;
const int X = 5001;
int n;
int parent[N];
vector<int> children[N];
int weight[N];
int other_weight[N];
bool visited[N];

int main() {
  cin.tie(0); cin.exceptions(cin.failbit);

  bool possible = true;

  scanf("%d", &n);

  // all a null child to the beginning of each vector
  rep(i, 1, n+1){
    children[i].PB(0);
  }

  rep(i, 2, n+1){
    scanf("%d", parent+i);
    children[parent[i]].PB(i);
  }
  rep(i, 1, n+1) scanf("%d", weight+i);

  queue<int> q;

  // add parents of the leaves
  rep(i, 1, n+1){
    if(sz(children[i]) == 1){ // no children
      if(parent[i]) { // has a parent
        q.push(parent[i]);
        visited[i] = true;
      }
    }
  }
  visited[0] = true;

  // bottom up BS
  while(!q.empty()){
    int v = q.front();
    q.pop();
    if(visited[v]) continue;
    visited[v] = true;
    q.push(parent[v]);
    // printf("v: %d\n", v);

    int nc = sz(children[v]);
    int hi = weight[v];

    // [# children used][weight of white] = is possible?
    bool dp[nc][hi+1];

    memset(dp, false, sizeof(dp));

    dp[0][0] = true;

    int total = 0;
    rep(i, 1, nc){
      int c = children[v][i];
      int wc = weight[c], owc = other_weight[c];

      total += wc + owc;

      rep(w, 0, hi+1){
        if(!dp[i-1][w]) continue;

        if(w + wc <= hi) dp[i][w+wc] = true;
        if(w + owc <= hi) dp[i][w+owc] = true;
      }
    }

    int ans = -1;
    rep(w, 0, hi+1){
      if(dp[nc-1][w]){
        // printf("nc-1: %d, w: %d\n", nc-1, w);
        ans = total - w;
      }
    }
    // printf("ans: %d\n", ans);

    if(ans == -1){
      possible = false;
      break;
    }

    other_weight[v] = ans;
  }

  printf("%s\n", possible ? "POSSIBLE" : "IMPOSSIBLE");
  return 0;
}
