#include<iostream>
#include<cstdio>
#include<cstring>
#define N 10010
using namespace std;
int ans[N],w[N];
int nxt[N<<1],to[N<<1],head[N<<1],cnt;
void add(int u,int v)
{
	nxt[++cnt]=head[u];
	to[cnt]=v;
	head[u]=cnt;
}
int g[2][N];
void dfs(int u)
{
	for(int i=head[u];i;i=nxt[i]) dfs(to[i]);
	memset(g[0],0x3f,sizeof(g[0]));
	int now=0;
	g[now][0]=0;
	for(int i=head[u];i;i=nxt[i])
	{
		int v=to[i];
        int pre=now;
        now=!now;
        memset(g[now],0x3f,sizeof(g[now]));
        for(int j=0;j<=w[u];j++)
		{
            if(j>=w[v]) g[now][j]=min(g[now][j],g[pre][j-w[v]]+ans[v]);
            if(j>=ans[v]) g[now][j]=min(g[now][j],g[pre][j-ans[v]]+w[v]);
        }
	}
	for(int i=0;i<=w[u];i++) ans[u]=min(ans[u],g[now][i]);
}
int main()
{
	int n;
	scanf("%d",&n);
    for(int i=2;i<=n;i++)
	{
		int fa;
		scanf("%d",&fa);
        add(fa,i);
    }
    for(int i=1;i<=n;i++) scanf("%d",&w[i]);
    memset(ans,0x3f,sizeof(ans));
    dfs(1);
    if(ans[1]<0x3f3f3f3f) puts("POSSIBLE");
	else puts("IMPOSSIBLE");
    return 0;
}