#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#define rg register
using namespace std;
const int N=1005,Inf=0x3f3f3f3f;
int n,num,x[N],dp[N][5005],ans[N],flg;
vector<int> vec[N];
void dfs(int u){
	for(rg int i=0;i<vec[u].size();++i) dfs(vec[u][i]);
	memset(dp[0],Inf,sizeof(dp[0])); flg=0; dp[0][0]=0;
	for(rg int i=0;i<vec[u].size();++i){
		int v=vec[u][i]; flg=!flg;
		memset(dp[flg],Inf,sizeof(dp[0]));
		for(rg int j=0;j<=x[u];++j){
			if(j>=x[v]) dp[flg][j]=min(dp[flg][j],dp[!flg][j-x[v]]+ans[v]);
			if(j>=ans[v]) dp[flg][j]=min(dp[flg][j],dp[!flg][j-ans[v]]+x[v]);
		}
	}
	for(rg int i=0;i<=x[u];++i) ans[u]=min(ans[u],dp[flg][i]);
}
int main(){
	memset(ans,Inf,sizeof(ans)); scanf("%d",&n);
	for(rg int i=2;i<=n;++i) scanf("%d",&num),vec[num].push_back(i);
	for(rg int i=1;i<=n;++i) scanf("%d",x+i);
	dfs(1); 
	if(ans[1]<Inf) puts("POSSIBLE");		
	else puts("IMPOSSIBLE");
	return 0;
}