There are two rooted trees, each with N vertices. The vertices of each tree are numbered 1 through N. In the first tree, the parent of Vertex i is Vertex A_i. Here, A_i=-1 if Vertex i is the root of the first tree. In the second tree, the parent of Vertex i is Vertex B_i. Here, B_i=-1 if Vertex i is the root of the second tree.

Snuke would like to construct an integer sequence of length N, X_1 , X_2 , ... , X_N, that satisfies the following condition:

* For each vertex on each tree, let the indices of its descendants including itself be a_1 , a_2 , ..., a_k. Then, abs(X_{a_1} + X_{a_2} + ... + X_{a_k})=1 holds.



Determine whether it is possible to construct such a sequence. If the answer is possible, find one such sequence.

Constraints

* 1 \leq N \leq 10^5
* 1 \leq A_i \leq N, if Vertex i is not the root in the first tree.
* A_i = -1, if Vertex i is the root in the first tree.
* 1 \leq B_i \leq N, if Vertex i is not the root in the second tree.
* B_i = -1, if Vertex i is the root in the second tree.
* Input corresponds to valid rooted trees.

Input

Input is given from Standard Input in the following format:


N
A_1 A_2 .. A_N
B_1 B_2 .. B_N


Output

If it is not possible to construct an integer sequence that satisfies the condition, print `IMPOSSIBLE`. If it is possible, print `POSSIBLE` in the first line. Then, in the second line, print X_1 , X_2 , ... , X_N, an integer sequence that satisfies the condition.

Examples

Input

5
3 3 4 -1 4
4 4 1 -1 1


Output

POSSIBLE
1 -1 -1 3 -1


Input

6
-1 5 1 5 1 3
6 5 5 3 -1 3


Output

IMPOSSIBLE


Input

8
2 7 1 2 2 1 -1 4
4 -1 4 7 4 4 2 4


Output

POSSIBLE
1 2 -1 0 -1 1 0 -1
#include<bits/stdc++.h>
#define L long long
#define vi vector<int>
#define pb push_back
#define pi pair<int,int>
#define pii pair<pi,int>
#define aa first
#define bb second
#define xx aa.aa
#define yy aa.bb
#define zz bb
#define mp make_pair
#define mpp(a,b,c) mp(mp(a,b),c)
using namespace std;
int n,w[100010],p;
vi a[100010],b[100010],x[100010];
inline int dfs(int i,vi a[])
{
	int k=0;
	for(auto j:a[i])
	  {
	   int l=dfs(j,a);
	   if(!k)
	     k=l;
	   else
	     {
		  x[k].pb(l);
		  x[l].pb(k);
		  k=0;
		 }
	  }
	if(k)
	  {
	   if(w[i]==3)
	     p=1;
	   else
	     w[i]=2;
	   return k;
	  }
	else
	  {
	   if(w[i]==2)
	     p=1;
	   else
	     w[i]=3;
	   return i;
	  }
}
inline void dfs(int i)
{
	for(auto j:x[i])
	  if(w[j]==3)
	    w[j]=-w[i],dfs(j);
}
int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	int i,j;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	  {
	   scanf("%d",&j);
	   if(j==-1)
	     j=0;
	   a[j].pb(i);
	  }
	for(i=1;i<=n;i++)
	  {
	   scanf("%d",&j);
	   if(j==-1)
	     j=0;
	   b[j].pb(i);
	  }
	dfs(0,a);
	dfs(0,b);
	if(p)
	  {
	   printf("IMPOSSIBLE");
	   return 0;
	  }
	for(i=1;i<=n;i++)
	  if(w[i]==2)
	    w[i]=0;
	  else if(w[i]==3)
	    {
		 w[i]=1;
		 dfs(i);
		}
	printf("POSSIBLE\n");
	for(i=1;i<=n;i++)
	  printf("%d ",w[i]);
	return 0;
}
