#include <bits/stdc++.h>
using namespace std;
bool v[100000];
int a[100000];
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
    a[i]--;
  }
  vector<vector<pair<int, int> > > ans;
  vector<pair<int, int> > two;
  vector<pair<int, pair<int, int> > > three;
  memset(v, false, sizeof(v));
  for (int i = 0; i < n; i++) {
    if (v[i]) continue;
    int j = a[i];
    v[i] = true;
    vector<int> cycle;
    cycle.push_back(i);
    while (j != i) {
      v[j] = true;
      cycle.push_back(j);
      j = a[j];
    }
    for (int k = cycle.size() - 1; k >= 3; k -= 4) {
      vector<pair<int, int> > step;
      if (k >= 4) {
        step.push_back(make_pair(cycle[k - 4], cycle[k - 3]));
        step.push_back(make_pair(cycle[k - 3], cycle[k - 2]));
        step.push_back(make_pair(cycle[k - 2], cycle[k - 1]));
        step.push_back(make_pair(cycle[k - 1], cycle[k]));
        step.push_back(make_pair(cycle[k], cycle[k - 4]));
      } else {
        step.push_back(make_pair(cycle[k - 3], cycle[k - 2]));
        step.push_back(make_pair(cycle[k - 2], cycle[k - 1]));
        step.push_back(make_pair(cycle[k - 1], cycle[k]));
        step.push_back(make_pair(cycle[k], cycle[k - 3]));
      }
      ans.push_back(step);
    }
    if (cycle.size() % 4 == 2) {
      two.push_back(make_pair(cycle[0], cycle[1]));
    }
    if (cycle.size() % 4 == 3) {
      three.push_back(make_pair(cycle[0], make_pair(cycle[1], cycle[2])));
    }
  }
  while (two.size() > 0 && three.size() > 0) {
    pair<int, int> a = two.back();
    pair<int, pair<int, int> > b = three.back();
    two.pop_back();
    three.pop_back();
    vector<pair<int, int> > step;
    step.push_back(make_pair(a.first, a.second));
    step.push_back(make_pair(a.second, a.first));
    step.push_back(make_pair(b.first, b.second.first));
    step.push_back(make_pair(b.second.first, b.second.second));
    step.push_back(make_pair(b.second.second, b.first));
    ans.push_back(step);
  }
  while (two.size() > 0) {
    pair<int, int> a = two.back();
    two.pop_back();
    vector<pair<int, int> > step;
    step.push_back(make_pair(a.first, a.second));
    step.push_back(make_pair(a.second, a.first));
    if (two.size() > 0) {
      pair<int, int> b = two.back();
      two.pop_back();
      step.push_back(make_pair(b.first, b.second));
      step.push_back(make_pair(b.second, b.first));
    }
    ans.push_back(step);
  }
  while (three.size() > 0) {
    pair<int, pair<int, int> > a = three.back();
    three.pop_back();
    vector<pair<int, int> > step1;
    step1.push_back(make_pair(a.first, a.second.first));
    step1.push_back(make_pair(a.second.first, a.second.second));
    step1.push_back(make_pair(a.second.second, a.first));
    if (three.size() > 0) {
      pair<int, pair<int, int> > b = three.back();
      three.pop_back();
      step1.push_back(make_pair(b.first, b.second.first));
      step1.push_back(make_pair(b.second.first, b.first));
      vector<pair<int, int> > step2;
      step2.push_back(make_pair(b.first, b.second.second));
      step2.push_back(make_pair(b.second.second, b.first));
      if (three.size() > 0) {
        pair<int, pair<int, int> > c = three.back();
        three.pop_back();
        step2.push_back(make_pair(c.first, c.second.first));
        step2.push_back(make_pair(c.second.first, c.second.second));
        step2.push_back(make_pair(c.second.second, c.first));
      }
      ans.push_back(step1);
      ans.push_back(step2);
    } else {
      ans.push_back(step1);
    }
  }
  printf("%d\n", (int)ans.size());
  for (int i = 0; i < ans.size(); i++) {
    printf("%d\n", (int)ans[i].size());
    for (int j = 0; j < ans[i].size(); j++)
      if (j < ans[i].size() - 1) {
        printf("%d ", ans[i][j].first + 1);
      } else {
        printf("%d\n", ans[i][j].first + 1);
      }
    for (int j = 0; j < ans[i].size(); j++)
      if (j < ans[i].size() - 1) {
        printf("%d ", ans[i][j].second + 1);
      } else {
        printf("%d\n", ans[i][j].second + 1);
      }
  }
  return 0;
}
