#include<bits/stdc++.h>
#define M 5005
#define INF 19260817
using namespace std;

struct edge{int u,next;}e[M]={0}; int head[M]={0},use=0;
void add(int x,int y){use++;e[use].u=y;e[use].next=head[x];head[x]=use;}

int f[M]={0},g[M]={0},dp[M]={0},X[M]={0};
int n;

void dfs(int x){
	f[x]=g[x]=INF;
	for(int i=head[x];i;i=e[i].next) dfs(e[i].u);
	for(int i=X[x];i;i--) dp[i]=INF; dp[0]=0;
	for(int i=head[x];i;i=e[i].next){
		int u=e[i].u;
		for(int j=X[x];j>=0;j--){
			int hh=INF;
			if(j>=X[u]) hh=min(hh,dp[j-X[u]]+f[u]);
			if(j>=g[u]) hh=min(hh,dp[j-g[u]]+X[u]);
			dp[j]=hh;
		}
	}
	for(int j=0;j<=X[x];j++) f[x]=min(f[x],dp[j]);
	
	for(int i=X[x];i;i--) dp[i]=INF; dp[0]=0;
	for(int i=head[x];i;i=e[i].next){
		int u=e[i].u;
		for(int j=X[x];j>=0;j--){
			int hh=INF;
			if(j>=X[u]) hh=min(hh,dp[j-X[u]]+g[u]);
			if(j>=f[u]) hh=min(hh,dp[j-f[u]]+X[u]);
			dp[j]=hh;
		}
	}
	for(int j=0;j<=X[x];j++) g[x]=min(g[x],dp[j]);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
}
	

int main(){
	scanf("%d",&n);
	for(int i=2;i<=n;i++){
		int x; scanf("%d",&x);
		add(x,i);
	}
	for(int i=1;i<=n;i++) scanf("%d",X+i); 
	dfs(1);
	if(f[1]==INF&&g[1]==INF) printf("IMPOSSIBLE\n");
	else printf("POSSIBLE\n");
}

Measured memory_bytes: 256