#include <iostream>
#include <vector>
#include <set>
using namespace std;
vector<vector<int>> con;
set<int> act; set<int> visited;
bool van=false;
void actual(int i, int p[], int l){
visited.insert(i);
set<int> now;
for(auto it=con[i].begin(); it!=con[i].end(); it++){
if(p[*it]!=-1){
int a=-l;
while(a!=l){
if(p[*it]+a>=0) now.insert(p[*it]+a);
a+=2;
}
}
if(!visited.count(*it)) actual(*it, p, l+1);
}
if(!van){
for(auto it=now.begin(); it!=now.end(); it++) act.insert(*it);
van=true;
}
//for(auto it=now.begin(); it!=now.end(); it++) cout << *it << '\n';
else for(auto it=act.begin(); it!=act.end(); it++) if(!now.count(*it)){act.erase(*it); it=act.begin(); if(act.size()==0) break;}
}
int solve(int i, int p[]){
//cout << '\n' << i << '\n';
visited.insert(i);
for(auto it=con[i].begin(); it!=con[i].end(); it++){
if(p[*it]!=-1){act.insert(p[*it]+1); act.insert(abs(p[*it]-1));}
if(act.size()>0) van=true;
actual(*it, p, 2);
}
if(act.size()==0) return -1;
int x=*(act.begin()); act.clear(); visited.clear();
return x;
}
int main(){
bool ok=true;
int n; cin >> n;
int p[n]; //f[n];
con.assign(n, vector<int>());
for(int i=0; i<n; i++){
int x; cin >> x;
if(x!=0){con[i].push_back(x-1); con[x-1].push_back(i);}
}
for(int i=0; i<n; i++) cin >> p[i];
for(int i=0; i<n; i++){
if(p[i]==-1) p[i]=solve(i, p);
if(p[i]==-1){ok=false; break;}
}
if(1){
cout << "IGEN\n";
for(int i=0; i<n; i++){
cout << p[i] << ' ';
}
}
else cout << "NEM";
}