#include <bits/stdc++.h>
using namespace std;
static const double EPS = 1e-9;
static const double PI = acos(-1.0);
int n;
int seq[100010];
int original[100010];
int temp[100010];
deque<deque<int> > op[2][6];
deque<deque<int> > rest[2];
void check() {
  memcpy(seq, original, sizeof(seq));
  for (int i = 0; i < (int)(op[0][5].size()); i++) {
    memcpy(temp, seq, sizeof(seq));
    for (int j = 0; j < (int)(op[0][5][i].size()); j++) {
      temp[op[1][5][i][j]] = seq[op[0][5][i][j]];
    }
    memcpy(seq, temp, sizeof(seq));
  }
  for (int i = 0; i < (int)(n); i++) {
    cout << seq[i] << " ";
  }
  puts("");
  for (int i = 0; i < (int)(n); i++) {
    assert(seq[i] == i + 1);
  }
}
void merge(int index) {
  deque<int> r01 = rest[0][index + 0];
  deque<int> r02 = rest[0][index + 1];
  deque<int> r03 = rest[0][index + 2];
  deque<int> r11 = rest[1][index + 0];
  deque<int> r12 = rest[1][index + 1];
  deque<int> r13 = rest[1][index + 2];
  r01.push_back(r03[1]);
  r01.push_back(r03[2]);
  r02.push_back(r03[0]);
  r02.push_back(r03[1]);
  r11.push_back(r03[2]);
  r11.push_back(r03[1]);
  r12.push_back(r03[1]);
  r12.push_back(r03[0]);
  op[0][5].push_back(r01);
  op[0][5].push_back(r02);
  op[1][5].push_back(r11);
  op[1][5].push_back(r12);
}
int main() {
  while (scanf("%d", &n) > 0) {
    rest[0].clear();
    rest[1].clear();
    for (int i = 0; i < (int)(6); i++) {
      op[0][i].clear();
      op[1][i].clear();
    }
    for (int i = 0; i < (int)(n); i++) {
      scanf("%d", &seq[i]);
    }
    memcpy(original, seq, sizeof(seq));
    for (int i = 0; i < (int)(n); i++) {
      while (seq[i] != i + 1) {
        deque<int> from;
        deque<int> to;
        int index = i;
        for (int j = 0; j < (int)(5); j++) {
          to.push_back(index);
          index = seq[index] - 1;
          if (index == i) {
            break;
          }
        }
        for (int j = 0; j < (int)(to.size()); j++) {
          int next = to[(j + 1) % to.size()];
          from.push_back(next);
          if (j != (int)to.size() - 1) {
            swap(seq[i], seq[next]);
          }
        }
        op[1][from.size()].push_back(from);
        op[0][to.size()].push_back(to);
      }
    }
    for (int i = 0; i < (int)(op[1][4].size()); i++) {
      op[1][5].push_back(op[1][4][i]);
      op[0][5].push_back(op[0][4][i]);
    }
    for (int i = 0; i < (int)(op[1][3].size()); i++) {
      deque<int> from = op[1][3][i];
      deque<int> to = op[0][3][i];
      if (op[1][2].size() != 0) {
        for (int j = 0; j < (int)(2); j++) {
          from.push_back(op[1][2][0][j]);
          to.push_back(op[0][2][0][j]);
        }
        op[1][2].pop_front();
        op[0][2].pop_front();
        op[1][5].push_back(from);
        op[0][5].push_back(to);
      } else {
        rest[0].push_back(op[0][3][i]);
        rest[1].push_back(op[1][3][i]);
      }
    }
    for (int i = 0; i < (int)(rest[0].size()); i++) {
      if (i + 2 >= (int)rest[0].size()) {
        op[0][5].push_back(rest[0][i]);
        op[1][5].push_back(rest[1][i]);
      } else {
        merge(i);
        i += 2;
      }
    }
    for (int i = 0; i < (int)(op[1][2].size()); i++) {
      deque<int> from = op[1][2][i];
      deque<int> to = op[0][2][i];
      if (i + 1 < (int)op[1][2].size()) {
        for (int j = 0; j < (int)(2); j++) {
          from.push_back(op[1][2][i + 1][j]);
          to.push_back(op[0][2][i + 1][j]);
        }
        i++;
      }
      op[1][5].push_back(from);
      op[0][5].push_back(to);
    }
    printf("%d\n", (int)op[0][5].size());
    for (int i = 0; i < (int)(op[0][5].size()); i++) {
      printf("%d\n", (int)op[0][5][i].size());
      for (int j = 0; j < (int)(op[0][5][i].size()); j++) {
        if (j != 0) {
          putchar(' ');
        }
        printf("%d", op[0][5][i][j] + 1);
      }
      puts("");
      for (int j = 0; j < (int)(op[1][5][i].size()); j++) {
        if (j != 0) {
          putchar(' ');
        }
        printf("%d", op[1][5][i][j] + 1);
      }
      puts("");
    }
  }
}
