#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5 + 10, inf = 1e9 + 7;
int n;
int Arr[MAX_N];
bool mark[MAX_N];
vector<vector<int> > TWO, TR, ans;
int main() {
  srand(clock());
  ios::sync_with_stdio(false), cin.tie(0);
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> Arr[i];
    Arr[i]--;
  }
  for (int i = 0; i < n; i++) {
    if (mark[i]) continue;
    vector<int> vec;
    vec.push_back(i);
    int v = i;
    while (Arr[v] != i && vec.size() < 5) {
      v = Arr[v];
      vec.push_back(v);
    }
    if (vec.size() == 1) continue;
    if (vec.size() == 2) {
      TWO.push_back(vec);
      for (int v : vec) mark[v] = true;
      continue;
    }
    if (vec.size() == 3) {
      TR.push_back(vec);
      for (int v : vec) mark[v] = true;
      continue;
    }
    if (vec.size() < 6) {
      ans.push_back(vec);
      vector<int> t;
      for (int i = 1; i < vec.size(); i++) t.push_back(vec[i]);
      t.push_back(vec[0]);
      ans.push_back(t);
      for (int i = 0; i + 1 < vec.size(); i++)
        swap(Arr[vec[0]], Arr[vec[i + 1]]);
      i--;
      continue;
    }
  }
  while (TR.size()) {
    while (TR.size() && TWO.size()) {
      vector<int> A = TR.back(), B = TWO.back(), C;
      TR.pop_back();
      TWO.pop_back();
      for (int v : A) C.push_back(v);
      for (int v : B) C.push_back(v);
      ans.push_back(C);
      swap(C[0], C[1]);
      swap(Arr[C[0]], Arr[C[1]]);
      swap(C[1], C[2]);
      swap(Arr[C[1]], Arr[C[2]]);
      swap(C[3], C[4]);
      swap(Arr[C[3]], Arr[C[4]]);
      ans.push_back(C);
    }
    if (!TR.size()) continue;
    vector<int> A = TR.back(), B, C;
    TR.pop_back();
    if (!TR.size()) {
      ans.push_back(A);
      swap(A[0], A[1]);
      swap(Arr[A[0]], Arr[A[1]]);
      swap(A[1], A[2]);
      swap(Arr[A[1]], Arr[A[2]]);
      ans.push_back(A);
      continue;
    }
    B = TR.back();
    TR.pop_back();
    for (int v : A) C.push_back(v);
    for (int v : B) C.push_back(v);
    C.pop_back();
    vector<int> H;
    H.push_back(B[0]);
    H.push_back(B.back());
    ans.push_back(C);
    swap(C[0], C[1]);
    swap(Arr[C[0]], Arr[C[1]]);
    swap(C[1], C[2]);
    swap(Arr[C[1]], Arr[C[2]]);
    swap(C[3], C[4]);
    swap(Arr[C[3]], Arr[C[4]]);
    ans.push_back(C);
    TWO.push_back(H);
  }
  while (TWO.size()) {
    vector<int> A = TWO.back(), B, C;
    TWO.pop_back();
    if (!TWO.size()) {
      ans.push_back(A);
      swap(A[0], A[1]);
      swap(Arr[A[0]], Arr[A[1]]);
      ans.push_back(A);
      break;
    }
    B = TWO.back();
    TWO.pop_back();
    for (int v : A) C.push_back(v);
    for (int v : B) C.push_back(v);
    ans.push_back(C);
    swap(C[0], C[1]);
    swap(Arr[C[0]], Arr[C[1]]);
    swap(C[2], C[3]);
    swap(Arr[C[2]], Arr[C[3]]);
    ans.push_back(C);
  }
  cout << ans.size() / 2 << endl;
  for (int i = 0; i < ans.size(); i++) {
    cout << ans[i].size() << endl;
    for (int j : ans[i]) cout << j + 1 << " ";
    cout << endl;
    i++;
    for (int j : ans[i]) cout << j + 1 << " ";
    cout << endl;
  }
  for (int i = 0; i < n; i++)
    if (Arr[i] != i) exit(-1);
  return 0;
}
