output_description: If the assignment is possible, print `POSSIBLE`; otherwise, print
  `IMPOSSIBLE`.
  
  * * *
input_description: Input is given from Standard Input in the following format:
  
      
      
      N
      p_1 p_2 ... p_N
attempt: import sys
  
  sys.setrecursionlimit(10**7)
  N = int(input())
  p = [i - 1 for i in map(int, input().split())]
  G = [[] for i in range(N)]
  for i, a in enumerate(p):
      G[a].append(i)
  visited = [False] * N
  Circle_ = [0]
  while not visited[Circle_[-1]]:
      visited[Circle_[-1]] = True
      Circle_.append(p[Circle_[-1]])
  Circle = [Circle_[-1]]
  inCircle = [False] * N
  for i in Circle_[: len(Circle_) - 1][::-1]:
      inCircle[i] = True
      Circle.append(i)
      if i == Circle_[-1]:
          break
  # print(Circle)
  # print(G)
  num = [[]] * N
  
  
  def dfs(x):
      List = [False] * N
      for a in G[x]:
          if inCircle[a]:
              continue
          List[dfs(a)] = True
      if inCircle[x]:
          res = []
          for i in range(N + 1):
              if not List[i]:
                  if not res:
                      res.append(i)
                  else:
                      res.append(i)
                      num[x] = res
                      return res
      else:
          for i in range(N + 1):
              if not List[i]:
                  num[x] = [i]
                  return i
  
  
  for i in Circle:
      dfs(i)
  # print(inCircle)
  # print(num)
  s, t = num[Circle[-1]][0], num[Circle[-1]][0]
  for i in Circle[: len(Circle) - 1][::-1]:
      if num[i][0] == t:
          t = num[i][1]
      else:
          t = num[i][0]
      # print(i,t)
  if t == s:
      print("POSSIBLE")
      exit()
  s, t = num[Circle[-1]][1], num[Circle[-1]][1]
  for i in Circle[: len(Circle) - 1][::-1]:
      if num[i][0] == t:
          t = num[i][1]
      else:
          t = num[i][0]
  # print(i,t)
  if t == s:
      print("POSSIBLE")
  else:
      print("INPOSSIBLE")
  
problem_description: Statement
  
  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.
samples: [{"input": "4\n    2 3 4 1", "output": "POSSIBLE\n    \n\nThe assignment is possible: {a_i} = {0, 1, 0, 1} or {a_i} = {1, 0, 1, 0}.\n\n* * *"}, {"input": "3\n    2 3 1", "output": "IMPOSSIBLE\n    \n\n* * *"}, {"input": "4\n    2 3 1 1", "output": "POSSIBLE\n    \n\nThe assignment is possible: {a_i} = {2, 0, 1, 0}.\n\n* * *"}, {"input": "6\n    4 5 6 5 6 4", "output": "IMPOSSIBLE"}]