#include <bits/stdc++.h>
using namespace std;
int n, m, ans = 0;
int a[100010], used[100010], d[100010];
vector<int> b[200010], p1, p2;
void work5(int i) {
  int t, j;
  j = b[i].size();
  printf("%d\n", 5);
  printf("%d %d %d %d %d\n", b[i][j - 5], b[i][j - 4], b[i][j - 3], b[i][j - 2],
         b[i][j - 1]);
  printf("%d %d %d %d %d\n", b[i][j - 4], b[i][j - 3], b[i][j - 2], b[i][j - 1],
         b[i][j - 5]);
  t = b[i][j - 5];
  b[i].pop_back();
  b[i].pop_back();
  b[i].pop_back();
  b[i].pop_back();
  b[i].pop_back();
  b[i].push_back(t);
}
void work4(int i) {
  printf("%d\n", 4);
  printf("%d %d %d %d\n", b[i][0], b[i][1], b[i][2], b[i][3]);
  printf("%d %d %d %d\n", b[i][1], b[i][2], b[i][3], b[i][0]);
  b[i].clear();
}
void work23(int i, int j) {
  printf("%d\n", 5);
  printf("%d %d %d %d %d\n", b[i][0], b[i][1], b[j][0], b[j][1], b[j][2]);
  printf("%d %d %d %d %d\n", b[i][1], b[i][0], b[j][1], b[j][2], b[j][0]);
  p1.pop_back();
  p2.pop_back();
}
void work33(int i, int j) {
  printf("%d\n", 5);
  printf("%d %d %d %d %d\n", b[i][0], b[i][1], b[i][2], b[j][0], b[j][1]);
  printf("%d %d %d %d %d\n", b[i][1], b[i][2], b[i][0], b[j][1], b[j][0]);
  m++;
  b[m].push_back(b[j][0]);
  b[m].push_back(b[j][2]);
  p2.pop_back();
  p2.pop_back();
  p1.push_back(m);
}
void work22(int i, int j) {
  printf("%d\n", 4);
  printf("%d %d %d %d\n", b[i][0], b[i][1], b[j][0], b[j][1]);
  printf("%d %d %d %d\n", b[i][1], b[i][0], b[j][1], b[j][0]);
  p1.pop_back();
  p1.pop_back();
}
void work3(int i) {
  printf("%d\n", 3);
  printf("%d %d %d\n", b[i][0], b[i][1], b[i][2]);
  printf("%d %d %d\n", b[i][1], b[i][2], b[i][0]);
  p2.pop_back();
}
void work2(int i) {
  printf("%d\n", 2);
  printf("%d %d\n", b[i][0], b[i][1]);
  printf("%d %d\n", b[i][1], b[i][0]);
  p1.pop_back();
}
int main() {
  int i, j, s2 = 0, s3 = 0, i1, j1, t;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (i = 1; i <= n; i++)
    if (used[i] == 0) {
      m++;
      j = a[i];
      while (j != i) {
        used[j] = 1;
        b[m].push_back(j);
        j = a[j];
      }
      used[i] = 1;
      b[m].push_back(i);
      d[m] = b[m].size();
    }
  for (i = 1; i <= m; i++)
    if (d[i] >= 5) {
      ans += d[i] / 4;
      d[i] %= 4;
    }
  sort(d + 1, d + m + 1);
  for (i = 1; i <= m; i++)
    if (d[i] == 2)
      s2++;
    else if (d[i] == 3)
      s3++;
    else if (d[i] == 4)
      ans++;
  t = min(s2, s3);
  ans += t;
  s2 -= t;
  s3 -= t;
  while (s2 > 0 || s3 > 0) {
    if (s2 > 0 && s3 > 0) {
      t = min(s2, s3);
      s2 -= t;
      s3 -= t;
      ans += t;
    } else if (s2 > 1) {
      ans += s2 / 2;
      s2 %= 2;
    } else if (s2 > 0) {
      s2--;
      ans++;
    } else if (s3 > 1) {
      s3 -= 2;
      s2++;
      ans++;
    } else if (s3 > 0) {
      s3--;
      ans++;
    }
  }
  printf("%d\n", ans);
  for (i = 1; i <= m; i++)
    while (b[i].size() >= 5) work5(i);
  for (i = 1; i <= m; i++)
    if (b[i].size() == 4) work4(i);
  for (i = 1; i <= m; i++)
    if (b[i].size() == 2)
      p1.push_back(i);
    else if (b[i].size() == 3)
      p2.push_back(i);
  while (p1.size() > 0 || p2.size() > 0) {
    if (p1.size() > 0 && p2.size() > 0)
      work23(p1[p1.size() - 1], p2[p2.size() - 1]);
    else if (p1.size() > 1)
      work22(p1[p1.size() - 2], p1[p1.size() - 1]);
    else if (p1.size() > 0)
      work2(p1[p1.size() - 1]);
    else if (p2.size() > 1)
      work33(p2[p2.size() - 2], p2[p2.size() - 1]);
    else if (p2.size() > 0)
      work3(p2[p2.size() - 1]);
  }
  return 0;
}
