// Original C++ solution (slower):
// warm heart, wagging tail,and a smile just for you!

//                                                                     ███████████   

//                                                                   ███╬╬╬╬╬╬╬╬╬╬███

//                                                                ███╬╬╬╬╬████╬╬╬╬╬╬███

//                                            ███████████       ██╬╬╬╬╬████╬╬████╬╬╬╬╬██

//                                      █████████╬╬╬╬╬████████████╬╬╬╬╬██╬╬╬╬╬╬███╬╬╬╬╬██

//                               ████████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████████╬╬╬╬╬╬██╬╬╬╬╬╬╬██

//                             ████╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████████╬╬╬╬╬╬╬╬╬╬╬██

//                           ███╬╬╬█╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬███╬╬╬╬╬╬╬█████

//                         ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬████████╬╬╬╬╬██

//                       ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬███╬╬╬╬╬╬╬╬╬███

//                     ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████╬╬╬╬╬╬╬██

//                 ████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬████╬╬╬╬╬████

//     █████████████╬╬╬╬╬╬╬╬██╬╬╬╬╬████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬███╬╬╬╬██████

//   ████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬██████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██████╬╬╬╬╬╬╬███████████╬╬╬╬╬╬╬╬██╬╬╬██╬╬╬██

// ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬████╬╬╬╬╬╬╬╬╬╬╬█╬╬╬╬╬╬╬██╬╬╬╬╬╬╬╬██

// ██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬▓▓▓▓▓▓╬╬╬████╬╬████╬╬╬╬╬╬╬▓▓▓▓▓▓▓▓██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬╬╬╬███

// ██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██████▓▓▓▓▓▓▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓▓▓▓▓▓▓██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬█████

// ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬███╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬████████

//   ███╬╬╬╬╬╬╬╬╬╬╬╬╬█████╬╬╬╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬███╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██

//       ██████████████  ████╬╬╬╬╬╬███████████████████████████╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬████

//                         ███████                           █████  ███████████████████  

#include "bits/stdc++.h"

using namespace std;

#define MOD 1000000007

const double EPS = 1e-9;

#define INF (1LL<<60)

#define fs first

#define sc second

#define pb push_back

#define int long long

#define FOR(i,a,b) for(int i=(a);i<(b);i++)

#define RFOR(i,a,b) for(int i = (b-1);i>=a;i--)

#define REP(i,n)  FOR(i,0,n)

#define RREP(i,n) RFOR(i,0,n)

#define ITR(itr,mp) for(auto itr = (mp).begin(); itr != (mp).end(); ++itr)

#define RITR(itr,mp) for(auto itr = (mp).rbegin(); itr != (mp).rend(); ++itr)

#define range(i,a,b) ((a)<=(i) && (i)<(b))

#define debug(x)  cout << #x << " = " << (x) << endl;

#define SP << " " << 

typedef pair<int,int> P;

typedef vector<vector<P> > Graph;

typedef vector<int> vec;

typedef vector<vector<int>> mat;



vec level[1000],edge[1000];

int mx = 0;

void dfs(int no, int cur){

  level[cur].push_back(no);

  mx = max(mx,cur);

  for(int to:edge[no]) dfs(to,cur+1);

}



signed main(){

  ios::sync_with_stdio(false);

  cin.tie(0);  

  //問題文を読む時間をケチらない！！

  //未定義動作に気を付ける！！

  //DPや二分探索の範囲に気をつける！！



  int n;

  cin >> n;



  vec p(n-1);

  REP(i,n-1) cin >> p[i];

  

  vec x(n);

  REP(i,n) cin >> x[i];

  

  REP(i,n-1){

    p[i]--;

    edge[p[i]].push_back(i+1);

  }



  dfs(0,0);



  //debug(mx);



  int val[2][n];

  while(mx >= 0){

    for(int per:level[mx]){

      //debug(per);

      int sum = 0, tot = 0;

      vec dp(100000,0);

      dp[0] = 1;

      for(int no:edge[per]){

        //debug(no);

        sum += val[0][no]; //小さい方

        tot += val[1][no]+val[0][no];

        int tmp = val[1][no]-val[0][no]; //差分

        RREP(i,dp.size()+1-tmp) dp[i+tmp] += dp[i];

      }

      if(x[per] < sum){

        cout << "IMPOSSIBLE" << endl;

        return 0;

      }

      //debug(tot);

      int lim = 0;

      REP(i,x[per]-sum+1) if(dp[i]) lim = i;

      tot -= sum + lim;

      //debug(tot);

      val[0][per] = min(tot,x[per]);

      val[1][per] = max(tot,x[per]);

    }

    mx--;

  }



  cout << "POSSIBLE" << endl;



  return 0;

}


// Optimized solution to the same problem (faster):
// warm heart, wagging tail,and a smile just for you!

//                                                                     ███████████   

//                                                                   ███╬╬╬╬╬╬╬╬╬╬███

//                                                                ███╬╬╬╬╬████╬╬╬╬╬╬███

//                                            ███████████       ██╬╬╬╬╬████╬╬████╬╬╬╬╬██

//                                      █████████╬╬╬╬╬████████████╬╬╬╬╬██╬╬╬╬╬╬███╬╬╬╬╬██

//                               ████████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████████╬╬╬╬╬╬██╬╬╬╬╬╬╬██

//                             ████╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████████╬╬╬╬╬╬╬╬╬╬╬██

//                           ███╬╬╬█╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬███╬╬╬╬╬╬╬█████

//                         ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬████████╬╬╬╬╬██

//                       ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬███╬╬╬╬╬╬╬╬╬███

//                     ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████╬╬╬╬╬╬╬██

//                 ████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬████╬╬╬╬╬████

//     █████████████╬╬╬╬╬╬╬╬██╬╬╬╬╬████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬███╬╬╬╬██████

//   ████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬██████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██████╬╬╬╬╬╬╬███████████╬╬╬╬╬╬╬╬██╬╬╬██╬╬╬██

// ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬████╬╬╬╬╬╬╬╬╬╬╬█╬╬╬╬╬╬╬██╬╬╬╬╬╬╬╬██

// ██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬▓▓▓▓▓▓╬╬╬████╬╬████╬╬╬╬╬╬╬▓▓▓▓▓▓▓▓██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬╬╬╬███

// ██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██████▓▓▓▓▓▓▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓▓▓▓▓▓▓██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬█████

// ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬███╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬████████

//   ███╬╬╬╬╬╬╬╬╬╬╬╬╬█████╬╬╬╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬███╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██

//       ██████████████  ████╬╬╬╬╬╬███████████████████████████╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬████

//                         ███████                           █████  ███████████████████  

#include "bits/stdc++.h"

using namespace std;

#define MOD 1000000007

const double EPS = 1e-9;

#define INF (1LL<<60)

#define fs first

#define sc second

#define pb push_back

#define int long long

#define FOR(i,a,b) for(int i=(a);i<(b);i++)

#define RFOR(i,a,b) for(int i = (b-1);i>=a;i--)

#define REP(i,n)  FOR(i,0,n)

#define RREP(i,n) RFOR(i,0,n)

#define ITR(itr,mp) for(auto itr = (mp).begin(); itr != (mp).end(); ++itr)

#define RITR(itr,mp) for(auto itr = (mp).rbegin(); itr != (mp).rend(); ++itr)

#define range(i,a,b) ((a)<=(i) && (i)<(b))

#define debug(x)  cout << #x << " = " << (x) << endl;

#define SP << " " << 

typedef pair<int,int> P;

typedef vector<vector<P> > Graph;

typedef vector<int> vec;

typedef vector<vector<int>> mat;



vec level[1000],edge[1000];

int mx = 0;

void dfs(int no, int cur){

  level[cur].push_back(no);

  mx = max(mx,cur);

  for(auto to:edge[no]) dfs(to,cur+1);

}



signed main(){

  ios::sync_with_stdio(false);

  cin.tie(0);  

  //問題文を読む時間をケチらない！！

  //未定義動作に気を付ける！！

  //DPや二分探索の範囲に気をつける！！



  int n;

  cin >> n;



  vec p(n-1);

  REP(i,n-1) cin >> p[i];

  

  vec x(n);

  REP(i,n) cin >> x[i];

  

  REP(i,n-1){

    p[i]--;

    edge[p[i]].push_back(i+1);

  }



  dfs(0,0);



  //debug(mx);



  int val[2][n];

  while(mx >= 0){

    for(auto per:level[mx]){

      //debug(per);

      int sum = 0, tot = 0;

      vec dp(x[per]+1,0);

      dp[0] = 1;

      for(auto no:edge[per]){

        //debug(no);

        sum += val[0][no]; //小さい方

        tot += val[1][no]+val[0][no];

        int tmp = val[1][no]-val[0][no]; //差分

        RREP(i,dp.size()-tmp) dp[i+tmp] += dp[i];

      }

      if(x[per] < sum){

        cout << "IMPOSSIBLE" << endl;

        return 0;

      }

      //debug(tot);

      int lim = 0;

      REP(i,x[per]-sum+1) if(dp[i]) lim = i;

      tot -= sum + lim;

      //debug(tot);

      val[0][per] = min(tot,x[per]);

      val[1][per] = max(tot,x[per]);

    }

    mx--;

  }



  cout << "POSSIBLE" << endl;



  return 0;

}

// Fastest known solution for this problem: