#include <bits/stdc++.h>
using namespace std;
int n, data[100015], num[10];
bool mark[100015];
vector<queue<int> > g[5];
struct Node {
  int k;
  int num[10];
  Node(int _k, int _num[]) {
    k = _k;
    memcpy(num, _num, sizeof(num));
  }
};
vector<Node> ans;
void insert(int &k, int num[], queue<int> &v) {
  while (!v.empty()) {
    num[k] = v.front();
    num[k + 5] = data[num[k]];
    v.pop();
    k++;
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &data[i]);
  for (int ii = 1; ii <= n; ii++) {
    if (mark[ii] || data[ii] == ii) continue;
    int k = ii;
    vector<int> v;
    v.clear();
    while (!mark[k]) {
      mark[k] = true;
      v.push_back(k);
      k = data[k];
    }
    int i = 0;
    while (v.size() - i > 5) {
      for (int k = 0; k < 4; k++) {
        num[k] = v[k + i];
        num[k + 5] = data[num[k]];
      }
      i += 4;
      num[4] = v[i];
      num[9] = num[0];
      data[num[0]] = data[v[i]];
      v[i] = num[0];
      ans.push_back(Node(5, num));
    }
    queue<int> que;
    while (!que.empty()) que.pop();
    for (; i < v.size(); i++) que.push(v[i]);
    if (que.size() >= 4) {
      int k = 0;
      insert(k, num, que);
      ans.push_back(Node(k, num));
    }
    if (que.size() == 0) continue;
    g[que.size()].push_back(que);
  }
  int i = 0, j = 0;
  while (i < g[3].size() && j < g[2].size()) {
    int k = 0;
    insert(k, num, g[3][i++]);
    insert(k, num, g[2][j++]);
    ans.push_back(Node(k, num));
  }
  while (g[3].size() - i >= 3) {
    int k = 0;
    insert(k, num, g[3][i++]);
    int a = g[3][i].front();
    g[3][i].pop();
    int b = g[3][i].front();
    g[3][i].pop();
    int c = g[3][i].front();
    g[3][i].pop();
    i++;
    num[3] = a;
    num[8] = b;
    num[4] = b;
    num[9] = a;
    ans.push_back(Node(5, num));
    k = 0;
    insert(k, num, g[3][i++]);
    num[3] = a;
    num[8] = c;
    num[4] = c;
    num[9] = a;
    ans.push_back(Node(5, num));
  }
  while (i < g[3].size()) {
    int k = 0;
    insert(k, num, g[3][i++]);
    ans.push_back(Node(k, num));
  }
  while (j < g[2].size()) {
    int k = 0;
    insert(k, num, g[2][j++]);
    if (j < g[2].size()) insert(k, num, g[2][j++]);
    ans.push_back(Node(k, num));
  }
  printf("%d\n", (int)ans.size());
  for (int i = 0; i < ans.size(); i++) {
    printf("%d\n", ans[i].k);
    for (int j = 0; j < ans[i].k; j++) printf("%d ", ans[i].num[j]);
    puts("");
    for (int j = 0; j < ans[i].k; j++) printf("%d ", ans[i].num[j + 5]);
    puts("");
  }
  return 0;
}
