#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, b) for(int i = a; i < (b); ++i)
#define rrep(i, b, a) for(int i = b; i >= a; --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];

bool possible;

void lrn(int v){
  if(!possible) return;

  trav(c, children[v]){
    lrn(c);
  }

  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;
  rrep(w, hi, 0){
    if(dp[nc-1][w]){
      ans = total - w;
      break;
      // printf("ans: %d\n", ans);
    }
  }

  if(ans == -1){
    possible = false;
  } else {
    other_weight[v] = ans;
  }
}

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);

  possible = true;

  lrn(1);

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