#include <stdio.h>
#define ll long long
#define rep(i,l,r)for(ll i=(l);i<(r);i++)

ll n;
ll check[1010];
ll root[1010];
ll x[1010];
ll y[1010];


ll ko[1010];
ll kocnt;
ll dp[5010];
void f(ll k){//頂点kの塗り方を決める

	//子孫の塗り方をチェックする
	check[k]=1;
	rep(i,0,n)if(root[i]==k&&!check[i])f(i);
	
	kocnt=0;
	rep(i,0,n)if(root[i]==k)ko[kocnt++]=i;

	//x[k]以下の最大値を探すdp
	ll upper=x[k];
	rep(i,0,5010)dp[i]=0;
	dp[0]=1;
	rep(i,0,kocnt){
		ll d=x[ko[i]]-y[ko[i]];
		for(ll j=5005;j>=d;j--)if(dp[j-d])dp[j]=1;
		upper-=y[ko[i]];
	}
	if(upper<0){
		puts("IMPOSSIBLE");
		exit(0);
	}
	for(ll j=upper;j>=0;j--)if(dp[j]){
		//j+ΣY=Z
		//求めるのはΣX+ΣY-Z=ΣX-j
		rep(i,0,kocnt)j-=x[ko[i]];
		y[k]=-j;
		break;
	}
}

int main(){
	scanf("%lld",&n);
	root[0]=-1;
	rep(i,1,n){
		ll t;
		scanf("%lld",&t);
		root[i]=t-1;
	}
	rep(i,0,n)scanf("%lld",x+i);
	
	f(0);
	puts("POSSIBLE");
//	rep(i,0,n)printf("%lld ",y[i]);
	return 0;
}