#include <bits/stdc++.h>
using namespace std;
int Get() {
  char c;
  while (c = getchar(), c < '0' || c > '9')
    ;
  int X = c - 48;
  while (c = getchar(), c >= '0' && c <= '9') X = X * 10 + c - 48;
  return X;
}
int Solve(int X, int Y) {
  int Ans = min(X, Y);
  X -= Ans;
  Y -= Ans;
  if (X > 0)
    Ans += X / 3 * 2 + X % 3;
  else
    Ans += (Y + 1) / 2;
  return Ans;
}
int main() {
  int N = Get();
  static int A[100001];
  for (int i = 1; i <= N; i++) A[i] = Get();
  static vector<int> X[100000], Y[100000], L2[100000], L3[100000];
  int Ans = 0, M2 = 0, M3 = 0;
  static bool Flag[100001];
  memset(Flag, 0, sizeof(Flag));
  for (int i = 1; i <= N; i++)
    if (!Flag[i]) {
      int M = 0, P = i;
      static int B[100000];
      while (true) {
        Flag[P] = true;
        B[M++] = P;
        P = A[P];
        if (P == i) break;
      }
      while (M > 5) {
        for (int j = M - 5; j < M; j++) X[Ans].push_back(B[j]);
        for (int j = M - 4; j < M; j++) Y[Ans].push_back(B[j]);
        Y[Ans].push_back(B[M - 5]);
        Ans++;
        M -= 4;
      }
      if (M >= 4) {
        for (int j = 0; j < M; j++) X[Ans].push_back(B[j]);
        for (int j = 1; j < M; j++) Y[Ans].push_back(B[j]);
        Y[Ans].push_back(B[0]);
        Ans++;
      } else if (M == 3) {
        for (int j = 0; j < 3; j++) L3[M3].push_back(B[j]);
        M3++;
      } else if (M == 2) {
        for (int j = 0; j < 2; j++) L2[M2].push_back(B[j]);
        M2++;
      }
    }
  while (M2 && M3) {
    M2--;
    M3--;
    for (int i = 0; i < 2; i++) {
      X[Ans].push_back(L2[M2][i]);
      Y[Ans].push_back(L2[M2][i ^ 1]);
    }
    for (int i = 0; i < 3; i++) {
      X[Ans].push_back(L3[M3][i]);
      Y[Ans].push_back(L3[M3][(i + 1) % 3]);
    }
    Ans++;
  }
  while (M2 >= 2) {
    M2--;
    for (int i = 0; i < 2; i++) {
      X[Ans].push_back(L2[M2][i]);
      Y[Ans].push_back(L2[M2][i ^ 1]);
    }
    M2--;
    for (int i = 0; i < 2; i++) {
      X[Ans].push_back(L2[M2][i]);
      Y[Ans].push_back(L2[M2][i ^ 1]);
    }
    Ans++;
  }
  if (M2) {
    X[Ans].push_back(L2[0][0]);
    X[Ans].push_back(L2[0][1]);
    Y[Ans].push_back(L2[0][1]);
    Y[Ans].push_back(L2[0][0]);
    Ans++;
  }
  while (M3 >= 3) {
    X[Ans].push_back(L3[M3 - 1][0]);
    Y[Ans].push_back(L3[M3 - 1][1]);
    X[Ans].push_back(L3[M3 - 1][1]);
    Y[Ans].push_back(L3[M3 - 1][2]);
    X[Ans].push_back(L3[M3 - 1][2]);
    Y[Ans].push_back(L3[M3 - 1][0]);
    X[Ans].push_back(L3[M3 - 2][0]);
    Y[Ans].push_back(L3[M3 - 2][1]);
    X[Ans].push_back(L3[M3 - 2][1]);
    Y[Ans].push_back(L3[M3 - 2][0]);
    Ans++;
    X[Ans].push_back(L3[M3 - 2][0]);
    Y[Ans].push_back(L3[M3 - 2][2]);
    X[Ans].push_back(L3[M3 - 2][2]);
    Y[Ans].push_back(L3[M3 - 2][0]);
    X[Ans].push_back(L3[M3 - 3][0]);
    Y[Ans].push_back(L3[M3 - 3][1]);
    X[Ans].push_back(L3[M3 - 3][1]);
    Y[Ans].push_back(L3[M3 - 3][2]);
    X[Ans].push_back(L3[M3 - 3][2]);
    Y[Ans].push_back(L3[M3 - 3][0]);
    Ans++;
    M3 -= 3;
  }
  while (M3) {
    M3--;
    for (int i = 0; i < 3; i++) {
      X[Ans].push_back(L3[M3][i]);
      Y[Ans].push_back(L3[M3][(i + 1) % 3]);
    }
    Ans++;
  }
  printf("%d\n", Ans);
  for (int i = 0; i < Ans; i++) {
    int M = X[i].size();
    printf("%d\n", M);
    for (int j = 0; j < M; j++) {
      printf("%d", X[i][j]);
      putchar((j == M - 1) ? '\n' : ' ');
    }
    for (int j = 0; j < M; j++) {
      printf("%d", Y[i][j]);
      putchar((j == M - 1) ? '\n' : ' ');
    }
  }
  return 0;
}
