#include <bits/stdc++.h>
using namespace std;
struct unionset {
  int ud[400000];
  void init() { memset(ud, -1, sizeof(ud)); }
  int root(int x) { return ud[x] < 0 ? x : ud[x] = root(ud[x]); }
  int size(int x) { return -ud[root(x)]; }
  bool same(int x, int y) { return root(x) == root(y); }
  bool set(int x, int y) {
    x = root(x);
    y = root(y);
    if (x != y) {
      if (ud[y] < ud[x]) std::swap(x, y);
      ud[x] += ud[y];
      ud[y] = x;
    }
    return x != y;
  }
} un;
int n, a[400000];
int m, b[10], c[10], r[10];
void add(int x, int k) {
  for (int i = 0; i < (int)(k); i++) {
    r[i] = x;
    x = a[x];
  }
  a[r[0]] = a[r[k - 1]];
  for (int i = 1; i < k; i++) a[r[i]] = r[i];
  for (int i = 0; i < (int)(k); i++) {
    b[m + i] = r[i];
    c[m + i] = r[(i + 1) % k];
  }
  m += k;
}
int qn, qm[400000], qb[400000][5], qc[400000][5];
void out() {
  qm[qn] = m;
  for (int i = 0; i < (int)(m); i++) qb[qn][i] = b[i];
  for (int i = 0; i < (int)(m); i++) qc[qn][i] = c[i];
  qn++;
  m = 0;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < (int)(n); i++) scanf("%d", a + i);
  for (int i = 0; i < (int)(n); i++) a[i]--;
  un.init();
  for (int i = 0; i < (int)(n); i++) un.set(i, a[i]);
  vector<int> v[5];
  for (int i = 0; i < (int)(n); i++)
    if (un.root(i) == i) {
      int s = un.size(i);
      while (s >= 5) {
        add(i, 5);
        out();
        s -= 4;
      }
      v[s].push_back(i);
    }
  for (int i = 0; i < (int)(n); i++) ((void)0);
  while (v[3].size()) {
    add(v[3].back(), 3);
    v[3].pop_back();
    if (v[2].size()) {
      add(v[2].back(), 2);
      v[2].pop_back();
    } else if (v[3].size()) {
      v[2].push_back(v[3].back());
      add(v[3].back(), 2);
      v[3].pop_back();
    }
    out();
  }
  while (v[2].size()) {
    add(v[2].back(), 2);
    v[2].pop_back();
    if (v[2].size()) {
      add(v[2].back(), 2);
      v[2].pop_back();
    }
    out();
  }
  while (v[4].size()) {
    add(v[4].back(), 4);
    v[4].pop_back();
    out();
  }
  for (int i = 0; i < (int)(n); i++) ((void)0);
  printf("%d\n", qn);
  for (int k = 0; k < (int)(qn); k++) {
    printf("%d\n", qm[k]);
    for (int i = 0; i < (int)(qm[k]); i++)
      printf("%d%c", qb[k][i] + 1, i < qm[k] - 1 ? ' ' : '\n');
    for (int i = 0; i < (int)(qm[k]); i++)
      printf("%d%c", qc[k][i] + 1, i < qm[k] - 1 ? ' ' : '\n');
  }
  return 0;
}
