#include <bits/stdc++.h>
#define syosu(x) fixed<<setprecision(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
typedef pair<double,double> pdd;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<string> vs;
typedef vector<P> vp;
typedef vector<vp> vvp;
typedef vector<pll> vpll;
typedef pair<P,int> pip;
typedef vector<pip> vip;
const int inf=1<<30;
const ll INF=1ll<<60;
const double pi=acos(-1);
const double eps=1e-8;
const ll mod=1e9+7;
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};

int n;
vvi g;
vi rg,vis,dp;

int dfs(int v){
	vis[v]=1;
	if(vis[rg[v]]) return v;
	return dfs(rg[v]);
}

int f(int v,int t){
	set<int> st;
	st.insert(t);
	for(auto u:g[v]) if(!vis[u]) st.insert(dp[u]);
	int I=0;
	while(st.find(I)!=st.end()) I++;
	return I;
}

void DFS(int v){
	for(auto u:g[v]) if(!vis[u]) DFS(u);
	dp[v]=f(v,-1);
}

int main(){
	cin>>n;
	g=vvi(n);
	rg=vis=dp=vi(n);
	for(int i=0;i<n;i++){
		cin>>rg[i];
		rg[i]--;
		g[rg[i]].push_back(i);
	}
	int C=dfs(0),c=C;
	vis=vi(n);
	do{vis[c]=1,c=rg[c];}while(c!=C);
	c=C;
	vi a,b;
	do{
		DFS(c);
		a.push_back(f(c,-1));
		b.push_back(f(c,a.back()));
		c=rg[c];
	}while(c!=C);
	int S=a.size(),A=a[0];
	bool B=0;
	for(int i=1;i<S;i++){
		if(a[i]==A) A=b[i];
		else A=a[i];
	}
	if(A!=a[0]) B=1;
	A=b[0];
	for(int i=1;i<S;i++){
		if(a[i]==A) A=b[i];
		else A=a[i];
	}
	if(A==a[0]) B=1;
	cout<<(B?"POSSIBLE":"IMPOSSIBLE")<<endl;
}
### Prompt

Please formulate a Cpp solution to the following problem:

There is a directed graph with N vertices and N edges. The vertices are numbered 1, 2, ..., N.

The graph has the following N edges: (p_1, 1), (p_2, 2), ..., (p_N, N), and the graph is weakly connected. Here, an edge from Vertex u to Vertex v is denoted by (u, v), and a weakly connected graph is a graph which would be connected if each edge was bidirectional.

We would like to assign a value to each of the vertices in this graph so that the following conditions are satisfied. Here, a_i is the value assigned to Vertex i.

* Each a_i is a non-negative integer.
* For each edge (i, j), a_i \neq a_j holds.
* For each i and each integer x(0 ≤ x < a_i), there exists a vertex j such that the edge (i, j) exists and x = a_j holds.



Determine whether there exists such an assignment.

Constraints

* 2 ≤ N ≤ 200 000
* 1 ≤ p_i ≤ N
* p_i \neq i
* The graph is weakly connected.

Input

Input is given from Standard Input in the following format:


N
p_1 p_2 ... p_N


Output

If the assignment is possible, print `POSSIBLE`; otherwise, print `IMPOSSIBLE`.

Examples

Input

4
2 3 4 1


Output

POSSIBLE


Input

3
2 3 1


Output

IMPOSSIBLE


Input

4
2 3 1 1


Output

POSSIBLE


Input

6
4 5 6 5 6 4


Output

IMPOSSIBLE

### Response

```cpp
#include <bits/stdc++.h>
#define syosu(x) fixed<<setprecision(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
typedef pair<double,double> pdd;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<string> vs;
typedef vector<P> vp;
typedef vector<vp> vvp;
typedef vector<pll> vpll;
typedef pair<P,int> pip;
typedef vector<pip> vip;
const int inf=1<<30;
const ll INF=1ll<<60;
const double pi=acos(-1);
const double eps=1e-8;
const ll mod=1e9+7;
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};

int n;
vvi g;
vi rg,vis,dp;

int dfs(int v){
	vis[v]=1;
	if(vis[rg[v]]) return v;
	return dfs(rg[v]);
}

int f(int v,int t){
	set<int> st;
	st.insert(t);
	for(auto u:g[v]) if(!vis[u]) st.insert(dp[u]);
	int I=0;
	while(st.find(I)!=st.end()) I++;
	return I;
}

void DFS(int v){
	for(auto u:g[v]) if(!vis[u]) DFS(u);
	dp[v]=f(v,-1);
}

int main(){
	cin>>n;
	g=vvi(n);
	rg=vis=dp=vi(n);
	for(int i=0;i<n;i++){
		cin>>rg[i];
		rg[i]--;
		g[rg[i]].push_back(i);
	}
	int C=dfs(0),c=C;
	vis=vi(n);
	do{vis[c]=1,c=rg[c];}while(c!=C);
	c=C;
	vi a,b;
	do{
		DFS(c);
		a.push_back(f(c,-1));
		b.push_back(f(c,a.back()));
		c=rg[c];
	}while(c!=C);
	int S=a.size(),A=a[0];
	bool B=0;
	for(int i=1;i<S;i++){
		if(a[i]==A) A=b[i];
		else A=a[i];
	}
	if(A!=a[0]) B=1;
	A=b[0];
	for(int i=1;i<S;i++){
		if(a[i]==A) A=b[i];
		else A=a[i];
	}
	if(A==a[0]) B=1;
	cout<<(B?"POSSIBLE":"IMPOSSIBLE")<<endl;
}
```