#include<bits/stdc++.h>
#define to edge[i].v
#define mp make_pair
#define rint register int
#define debug(x) cerr<<#x<<"="<<x<<endl
#define fgx cerr<<"-------------"<<endl
#define N 1010
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int g[N][5010],f[N],head[N],a[N],tot;
struct Edge{int v,next;Edge(int _v=0,int _n=0):v(_v),next(_n){}}edge[1000000];
inline void add(int x,int y){edge[++tot]=Edge(y,head[x]);head[x]=tot;}
void dfs(int x)
{	g[x][0]=0;
	for(rint i=head[x];i;i=edge[i].next)
	{	dfs(to);
		for(rint j=a[x];j>=max(a[to],f[to]);j--)
		g[x][j]=min(g[x][j-a[to]]+f[to],g[x][j-f[to]]+a[to]);
		if(a[to]>=f[to])
		{	for(rint j=a[to]-1;j>=f[to];j--) g[x][j]=g[x][j-f[to]]+a[to];
			for(rint j=f[to]-1;j>=0;j--) g[x][j]=1e9;
		}
		else
		{	for(rint j=f[to]-1;j>=a[to];j--) g[x][j]=g[x][j-a[to]]+f[to];
			for(rint j=a[to]-1;j>=0;j--) g[x][j]=1e9;
		}
	}
	for(rint i=0;i<=a[x];i++) f[x]=min(f[x],g[x][i]);
	if(f[x]==1e9){printf("IMPOSSIBLE");exit(0);}
}
int main()
{	int n,x; scanf("%d",&n);
	for(rint i=1;i<=n;f[i]=1e9,i++)
	for(rint j=0;j<=5000;j++) g[i][j]=1e9;
	for(rint i=2;i<=n;i++) scanf("%d",&x),add(x,i);
	for(rint i=1;i<=n;i++) scanf("%d",&a[i]);
	dfs(1); printf("POSSIBLE");
	return 0;
}
