#include <bits/stdc++.h>
using namespace std;
long long int powm(long long int a, int b, int n) {
  long long int rm = 1;
  while (b) {
    if (b % 2) {
      rm = (rm * a) % n;
    }
    a = (a * a) % n;
    b /= 2;
  }
  return rm;
}
const int N = 100009;
int a[N];
deque<int> cycle[N];
deque<int> three, two, huge;
vector<int> c[N], b[N];
int cycle_id[N], cid = 0, ans = 0;
bool visited[N] = {false};
void get_cycle(int index) {
  if (visited[index]) return;
  visited[index] = true;
  cycle[cid].push_back(index);
  cycle_id[index] = cid;
  get_cycle(a[index]);
}
void print(int id) {
  for (int i = 0; i < cycle[id].size(); ++i) b[ans].push_back(cycle[id][i]);
  for (int i = 1; i < cycle[id].size(); ++i) c[ans].push_back(cycle[id][i]);
  c[ans].push_back(cycle[id][0]);
}
void f22(int id1, int id2) {
  b[ans].push_back(cycle[id1][0]);
  b[ans].push_back(cycle[id1][1]);
  c[ans].push_back(cycle[id1][1]);
  c[ans].push_back(cycle[id1][0]);
  b[ans].push_back(cycle[id2][0]);
  b[ans].push_back(cycle[id2][1]);
  c[ans].push_back(cycle[id2][1]);
  c[ans].push_back(cycle[id2][0]);
}
void f23(int id2, int id3) {
  b[ans].push_back(cycle[id2][0]);
  b[ans].push_back(cycle[id2][1]);
  c[ans].push_back(cycle[id2][1]);
  c[ans].push_back(cycle[id2][0]);
  for (int i = 0; i < 3; ++i) b[ans].push_back(cycle[id3][i]);
  for (int i = 1; i < 3; ++i) c[ans].push_back(cycle[id3][i]);
  c[ans].push_back(cycle[id3][0]);
}
void f33(int id1, int id2) {
  for (int i = 0; i < 3; ++i) b[ans].push_back(cycle[id1][i]);
  for (int i = 1; i < 3; ++i) c[ans].push_back(cycle[id1][i]);
  c[ans].push_back(cycle[id1][0]);
  b[ans].push_back(cycle[id2][0]);
  b[ans].push_back(cycle[id2][1]);
  c[ans].push_back(cycle[id2][1]);
  c[ans].push_back(cycle[id2][0]);
  int keep_ele = cycle[id2][0];
  for (int i = 0; i < 2; ++i) cycle[id2].pop_front();
  cycle[id2].push_front(keep_ele);
  two.push_back(id2);
}
void break_f(int id) {
  int mn_szz, keep_ele, szz;
  while (cycle[id].size() > 3) {
    szz = cycle[id].size();
    mn_szz = min(szz, 5);
    ans++;
    for (int i = 0; i < mn_szz; ++i) b[ans].push_back(cycle[id][i]);
    for (int i = 1; i < mn_szz; ++i) c[ans].push_back(cycle[id][i]);
    c[ans].push_back(cycle[id][0]);
    keep_ele = cycle[id][0];
    for (int i = 0; i < mn_szz; ++i) cycle[id].pop_front();
    cycle[id].push_front(keep_ele);
  }
}
int main() {
  int n;
  cin >> n;
  for (int i = int(1); i <= (int)n; i++) scanf("%d", &a[i]);
  ;
  for (int i = 1; i <= n; ++i) {
    if (!visited[i]) {
      ++cid;
      get_cycle(i);
    }
  }
  for (int i = 1; i <= cid; ++i) {
    if (cycle[i].size() == 1) {
    } else if (cycle[i].size() == 2)
      two.push_back(i);
    else if (cycle[i].size() == 3)
      three.push_back(i);
    else if (cycle[i].size() == 4) {
      ans++;
      print(i);
    } else if (cycle[i].size() == 5) {
      ans++;
      print(i);
    } else
      huge.push_back(i);
  }
  while (!huge.empty()) {
    int h_fid = huge.front();
    break_f(h_fid);
    huge.pop_front();
    int szz = cycle[h_fid].size();
    if (szz == 2)
      two.push_back(h_fid);
    else if (szz == 3)
      three.push_back(h_fid);
  }
  while (!three.empty()) {
    if (!two.empty() && !three.empty()) {
      int two_f = two.front(), three_f = three.front();
      ans++;
      f23(two_f, three_f);
      two.pop_front();
      three.pop_front();
    } else if (three.empty())
      break;
    else if (three.size() > 1) {
      int three_f1 = three.front();
      three.pop_front();
      int three_f2 = three.front();
      three.pop_front();
      ans++;
      f33(three_f1, three_f2);
    } else if (three.size() == 1) {
      ans++;
      print(three.front());
      three.pop_front();
      break;
    }
  }
  while (two.size() > 1) {
    int two_f1 = two.front();
    two.pop_front();
    int two_f2 = two.front();
    two.pop_front();
    ans++;
    f22(two_f1, two_f2);
  }
  if (two.size() == 1) {
    ans++;
    print(two.front());
    two.pop_front();
  }
  cout << ans << endl;
  for (int i = int(1); i <= (int)ans; i++) {
    int k = b[i].size();
    cout << k << endl;
    cout << b[i][0];
    for (int j = 1; j < k; ++j) cout << " " << b[i][j];
    cout << endl;
    cout << c[i][0];
    for (int j = 1; j < k; ++j) cout << " " << c[i][j];
    cout << endl;
  }
  return 0;
}
