#include <bits/stdc++.h>
using std::min;
const int fin = 0, maxn = 100002;
const int deb = 0;
int n;
int a[maxn];
int c[6], q[maxn];
bool vis[maxn];
struct pt {
  int n, a[5], b[5];
  pt() { n = 0; }
  pt ist(int x, int y) {
    a[n] = x, b[n++] = y;
    return *this;
  }
  pt operator+(pt a) {
    pt b = *this;
    for (int i = 0; i < a.n; ++i) b.ist(a.a[i], a.b[i]);
    return b;
  }
  void print() {
    printf("%d\n", n);
    for (int i = 0; i < n; ++i) printf("%d ", a[i]);
    puts("");
    for (int i = 0; i < n; ++i) printf("%d ", b[i]);
    puts("");
  }
} A[6][maxn];
int main() {
  if (fin) {
    freopen("t.in", "r", stdin);
    freopen("t.out", "w", stdout);
  }
  int i, j, k, p, x, y, ans, t;
  pt T, B;
  scanf("%d", &n);
  for (i = 1; i <= n; ++i) scanf("%d", a + i);
  for (i = 1; i <= n; ++i)
    if (!vis[i]) {
      q[q[0] = 1] = i, vis[i] = 1;
      for (j = a[i]; j != i; j = a[j]) vis[j] = 1, q[++q[0]] = j;
      if (deb) {
        printf("%d\n", q[0]);
        for (i = 1; i <= q[0]; ++i) printf("%d ", q[i]);
        puts("");
      }
      if (q[0] >= 5) {
        for (k = q[0] - 4; k > 1; k -= 4)
          for (++c[5], j = 0; j < 5; ++j)
            A[5][c[5]].ist(q[k + j], q[k + (j + 1) % 5]);
        for (p = k + 4, k = 1, ++c[p], j = 0; j < p; ++j)
          A[p][c[p]].ist(q[k + j], q[k + (j + 1) % p]);
      } else
        for (p = q[0], k = 1, ++c[p], j = 0; j < p; ++j)
          A[p][c[p]].ist(q[k + j], q[k + (j + 1) % p]);
    }
  if (deb) puts("\n");
  ans = c[4] + c[5], x = c[2], y = c[3];
  t = min(x, y), ans += t, x -= t, y -= t;
  if (x)
    ans += (x + 1) / 2;
  else
    ans += y / 3 * 2 + y % 3;
  printf("%d\n", ans);
  for (p = 5; p > 3; --p)
    for (i = 1; i <= c[p]; ++i) A[p][i].print();
  while (c[2] && c[3]) (A[2][c[2]--] + A[3][c[3]--]).print();
  if (c[2]) {
    while (c[2] > 1) (A[2][c[2]] + A[2][c[2] - 1]).print(), c[2] -= 2;
    if (c[2]) A[2][1].print();
  } else {
    while (c[3] > 2) {
      T = A[3][c[3]], B = A[3][c[3] - 1];
      T.ist(B.a[1], B.a[2]), T.ist(B.a[2], B.a[1]);
      T.print();
      T = A[3][c[3] - 2];
      T.ist(B.a[0], B.a[1]), T.ist(B.a[1], B.a[0]);
      T.print();
      c[3] -= 3;
    }
    while (c[3]) A[3][c[3]--].print();
  }
  return 0;
}
