#include <bits/stdc++.h>
using namespace std;
inline int min(int _a, int _b) { return _a < _b ? _a : _b; }
inline int max(int _a, int _b) { return _a > _b ? _a : _b; }
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
int o[6][100010][6], L[6], e[6], f[6], g[6], a[100010], c, n;
bool b[100010];
template <class _T>
inline void rd(_T &_a) {
  int _f = 0, _ch = getchar();
  _a = 0;
  while (_ch < '0' || _ch > '9') {
    if (_ch == '-') _f = 1;
    _ch = getchar();
  }
  while (_ch >= '0' && _ch <= '9')
    _a = (_a << 1) + (_a << 3) + _ch - '0', _ch = getchar();
  if (_f) _a = -_a;
}
void put(int x, int y) {
  for (int i = 1; i <= x; ++i)
    f[++c] = o[x][y][i], g[(i < 2 ? c + x : c) - 1] = f[c];
}
void print() {
  printf("%d\n", c);
  for (int i = 1; i <= c; ++i) printf("%d%s", f[i], i < c ? " " : "\n");
  for (int i = 1; i <= c; ++i) printf("%d%s", g[i], i < c ? " " : "\n");
  c = 0;
}
int main() {
  rd(n);
  for (int i = 1; i <= n; ++i) rd(a[i]);
  for (int i = 1; i <= n; ++i)
    while (!b[i]) {
      int j = a[i];
      e[c = 1] = i;
      for (; j != i && c < 5; j = a[j]) e[++c] = j, b[j] = 1;
      b[i] = j == i;
      a[i] = j;
      memcpy(o[c][++L[c]], e, sizeof(e));
    }
  while (L[3] > L[2] + 2) {
    o[2][++L[2]][1] = o[3][L[3]][2], o[2][L[2]][2] = o[3][L[3]][3];
    o[2][++L[2]][1] = o[3][L[3]][1], o[2][L[2]][2] = o[3][L[3]][2];
    --L[3];
  }
  int j = 1, ans = L[2] - L[3] + 1;
  ans = ans < 0 ? 0 : ans / 2;
  ans += L[5] + L[4] + L[3];
  printf("%d\n", ans);
  c = 0;
  for (int i = 1; i <= L[5]; ++i) put(5, i), print();
  for (int i = 1; i <= L[4]; ++i) put(4, i), print();
  for (int i = 1; i <= L[3]; ++i) {
    put(3, i);
    if (j <= L[2]) put(2, j), ++j;
    print();
  }
  while (j <= L[2]) {
    put(2, j);
    ++j;
    if (j <= L[2]) put(2, j), ++j;
    print();
  }
  return 0;
}
