#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int SIZE = 1e6 + 10;
struct Union_Find {
  int d[SIZE], num[SIZE];
  void init(int n) {
    for (int i = 0; i < (n); ++i) d[i] = i, num[i] = 1;
  }
  int find(int x) { return (x != d[x]) ? (d[x] = find(d[x])) : x; }
  bool uu(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) return 0;
    if (num[x] > num[y]) swap(x, y);
    num[y] += num[x];
    d[x] = y;
    return 1;
  }
} U;
vector<int> an[SIZE];
pair<int, int> pp[SIZE];
int main() {
  int(n);
  scanf("%d", &n);
  U.init(n);
  for (int i = 0; i < (n); ++i) {
    int(x);
    scanf("%d", &x);
    pp[i] = make_pair(x, i);
  }
  sort(pp, pp + n);
  for (int i = 0; i < (n); ++i) {
    U.uu(i, pp[i].second);
  }
  int cnt = 0;
  for (int i = 0; i < (n); ++i) {
    int id = U.find(i);
    if (!((int)(an[id]).size())) cnt++;
    an[id].push_back(i);
  }
  printf("%d\n", cnt);
  for (int i = 0; i < (SIZE); ++i) {
    if (((int)(an[i]).size())) {
      printf("%d", ((int)(an[i]).size()));
      for (int j = 0; j < (((int)(an[i]).size())); ++j)
        printf(" %d", an[i][j] + 1);
      puts("");
    }
  }
  return 0;
}
