#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100000 + 20;
int a[MAX_N], pos[MAX_N];
deque<int> C[MAX_N], cycle;
int mark[MAX_N];
int cy;
vector<int> kind[2], seq[2][MAX_N];
int res;
int n;
void dfs(int v, int co) {
  if (mark[v]) return;
  mark[v] = 1;
  C[co].push_back(v);
  dfs(a[v], co);
}
void f() {
  for (int i(0); i < int(cycle.size()); i++)
    seq[0][res].push_back(pos[cycle[i]]);
  seq[1][res].resize(seq[0][res].size());
  for (int i(0); i < int(seq[1][res].size()); i++) seq[1][res][i] = -1;
  int node[5] = {};
  for (int i(0); i < int(cycle.size()); i++) {
    int v = cycle[i];
    for (int j(0); j < int(seq[0][res].size()); j++)
      if (!node[j] && seq[0][res][j] == v) {
        seq[1][res][i] = v;
        node[j] = 1;
      }
  }
  for (int i(0); i < int(cycle.size()); i++)
    if (seq[1][res][i] == -1)
      for (int j(0); j < int(seq[0][res].size()); j++)
        if (!node[j]) {
          seq[1][res][i] = seq[0][res][j];
          node[j] = 1;
        }
  for (int i(0); i < int(cycle.size()); i++) pos[cycle[i]] = seq[1][res][i];
  while (!cycle.empty() && pos[cycle.front()] == cycle.front())
    cycle.pop_front();
  while (!cycle.empty() && pos[cycle.back()] == cycle.back()) cycle.pop_back();
  ++res;
}
void clean(int id) {
  cycle.clear();
  while (!C[id].empty() && cycle.size() + C[id].size() >= 5) {
    if (cycle.size() == 5) f();
    cycle.push_back(C[id].front());
    C[id].pop_front();
  }
  if (cycle.size() >= 4) f();
  while (!cycle.empty()) {
    C[id].push_front(cycle.back());
    cycle.pop_back();
  }
  if (C[id].size() == 4) {
    while (!C[id].empty()) {
      cycle.push_back(C[id].front());
      C[id].pop_front();
    }
    f();
  }
  if (C[id].size() > 1) kind[(int)(C[id].size()) & 1].push_back(id);
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  for (int i(0); i < int(n); i++) {
    cin >> a[i];
    pos[--a[i]] = i;
  }
  for (int i(0); i < int(n); i++)
    if (!mark[a[i]]) {
      dfs(a[i], cy);
      if (C[cy].size() > 3)
        clean(cy);
      else if (C[cy].size() > 1)
        kind[(int)(C[cy].size()) & 1].push_back(cy);
      ++cy;
    }
  while (!kind[0].empty() && !kind[1].empty()) {
    cycle.clear();
    int idx = kind[0].back();
    while (!C[idx].empty()) {
      cycle.push_back(C[idx].front());
      C[idx].pop_front();
    }
    idx = kind[1].back();
    while (!C[idx].empty()) {
      cycle.push_back(C[idx].front());
      C[idx].pop_front();
    }
    kind[0].pop_back();
    kind[1].pop_back();
    f();
  }
  while (kind[1].size() > 2) {
    for (int i(0); i < int(3); i++) {
      int id = kind[1].back();
      kind[1].pop_back();
      while (!C[id].empty()) {
        C[cy].push_back(C[id].front());
        C[id].pop_front();
      }
    }
    clean(cy);
  }
  while (!kind[1].empty()) {
    int id = kind[1].back();
    kind[1].pop_back();
    cycle.clear();
    while (!C[id].empty()) {
      cycle.push_back(C[id].front());
      C[id].pop_front();
    }
    f();
  }
  for (int i = 1; i < kind[0].size(); i += 2) {
    int id = kind[0][i - 1];
    cycle.clear();
    while (!C[id].empty()) {
      cycle.push_back(C[id].front());
      C[id].pop_front();
    }
    id = kind[0][i];
    while (!C[id].empty()) {
      cycle.push_back(C[id].front());
      C[id].pop_front();
    }
    f();
  }
  if (kind[0].size() % 2 == 1) {
    int id = kind[0].back();
    while (!C[id].empty()) {
      cycle.push_back(C[id].front());
      C[id].pop_front();
    }
    f();
  }
  cout << res << endl;
  for (int i(0); i < int(res); i++) {
    cout << seq[0][i].size() << endl;
    for (int j(0); j < int(seq[0][i].size()); j++)
      cout << seq[0][i][j] + 1 << ' ';
    cout << endl;
    for (int j(0); j < int(seq[1][i].size()); j++)
      cout << seq[1][i][j] + 1 << ' ';
    cout << endl;
  }
  return 0;
}
