//by yjz
#include<bits/stdc++.h>
using namespace std;
#define FF first
#define SS second
#define PB push_back
#define MP make_pair
#define bged(v) (v).begin(),(v).end()
#define foreach(it,s) for(__typeof((s).begin()) it=(s).begin();it!=(s).end();it++)
#define debug(...) (cerr<<"'"<<__FUNCTION__<<"': "),fprintf(stderr,__VA_ARGS__)
typedef long long ll;
const int Imx=2147483647;
const ll Lbig=2e18;
const int mod=1e9+7;
//My i/o stream
struct fastio
{
	char s[100000];
	int it,len;
	fastio(){it=len=0;}
	inline char get()
	{
		if(it<len)return s[it++];it=0;
		len=fread(s,1,100000,stdin);
		if(len==0)return EOF;else return s[it++];
	}
	bool notend()
	{
		char c=get();
		while(c==' '||c=='\n')c=get();
		if(it>0)it--;
		return c!=EOF;
	}
}_buff;
#define geti(x) x=getnum()
#define getii(x,y) geti(x),geti(y)
#define getiii(x,y,z) getii(x,y),geti(z)
#define puti(x) putnum(x),putchar(' ')
#define putii(x,y) puti(x),puti(y)
#define putiii(x,y,z) putii(x,y),puti(z)
#define putsi(x) putnum(x),putchar('\n')
#define putsii(x,y) puti(x),putsi(y)
#define putsiii(x,y,z) putii(x,y),putsi(z)
inline ll getnum()
{
	ll r=0;bool ng=0;char c;c=_buff.get();
	while(c!='-'&&(c<'0'||c>'9'))c=_buff.get();
	if(c=='-')ng=1,c=_buff.get();
	while(c>='0'&&c<='9')r=r*10+c-'0',c=_buff.get();
	return ng?-r:r;
}
template<class T> inline void putnum(T x)
{
	if(x<0)putchar('-'),x=-x;
	register short a[22]={},sz=0;
	while(x)a[sz++]=x%10,x/=10;
	if(sz==0)putchar('0');
	for(int i=sz-1;i>=0;i--)putchar('0'+a[i]);
}
inline char getreal(){char c=_buff.get();while(c==' '||c=='\n')c=_buff.get();return c;}
int n;
vector<int> con[220111];
int col[220111];
bool vis[5000111];
bool cyc[220111];
bool hs[111];
int tot,nxt[220111];
bool live[5000111];
void dfs(int x)
{
//	cerr<<"dfs:"<<x<<endl;
	vis[x]=1;
	live[x]=1;
	for(int i=0;i<con[x].size();i++)
	{
		if(live[con[x][i]])
		{
			cyc[x]=1;
			continue;
		}
		dfs(con[x][i]);
		cyc[x]|=cyc[con[x][i]];
	}
	if(!cyc[x])
	{
		for(int i=0;i<con[x].size();i++)hs[col[con[x][i]]]=1;
		while(hs[col[x]])col[x]++;
		for(int i=0;i<con[x].size();i++)hs[col[con[x][i]]]=0;
	}
	else tot++;
	live[x]=0;
}
int go[5000111];
int dis[5000111];
bool dfs2(int x)
{
//	cerr<<"x="<<x<<" "<<dis[x]<<endl;
	vis[x]=1;live[x]=1;
	int ret=1;
	int u=go[x];
	if(live[u])
	{
		if(dis[x]-dis[u]+1==tot)return true;
	}
	if(!vis[u])
	{
		dis[u]=dis[x]+1;
		if(dfs2(u))return true;
	}
	live[x]=0;
	return false;
}
int main()
{
	geti(n);
	for(int i=1;i<=n;i++)
	{
		int x;
		geti(x);
		con[x].PB(i);
	}
	for(int i=1;i<=n;i++)
	{
		if(!vis[i])
		{
			dfs(i);
		}
	}
//	cerr<<"tot="<<tot<<endl;
	for(int i=1;i<=n;i++)
	{
		if(!cyc[i])continue;
		for(int j=0;j<con[i].size();j++)if(!cyc[con[i][j]])hs[col[con[i][j]]]=1;else nxt[i]=con[i][j];
//		cout<<"i="<<i<<" "<<nxt[i]<<endl;
		for(int y=0;y<22;y++)
		{
			int x=0;
			while(x==y||hs[x])x++;
			assert(x<22);
			go[nxt[i]*22+y]=i*22+x;
//			cout<<x<<" "<<y<<endl;
		}
		for(int j=0;j<con[i].size();j++)if(!cyc[con[i][j]])hs[col[con[i][j]]]=0;
	}
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)
	{
		if(!cyc[i])continue;
		for(int j=0;j<22;j++)
		{
			if(!vis[i*22+j])
			{
				if(dfs2(i*22+j))
				{
					puts("POSSIBLE");
					return 0;
				}
			}
		}
	}
	puts("IMPOSSIBLE");
	return 0;
}

Measured memory_bytes: 67328