#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n;
int a[N];
int b[N];
map<int, int> M, M2;
int poz[N];
void load() {
  cin >> n;
  for (int i = 0; i < n; i++) cin >> a[i];
}
int parent[N];
int depth[N];
int bio[N];
int find(int x) {
  if (x == parent[x]) return x;
  int pr = find(parent[x]);
  parent[x] = pr;
  return pr;
}
void spoji(int x, int y) {
  x = find(x);
  y = find(y);
  if (x == y) spoji(x, y);
  if (depth[x] == depth[y]) depth[x]++;
  if (depth[x] > depth[y])
    parent[y] = x;
  else
    depth[x] = y;
}
void dfs(int node) {
  bio[node] = 1;
  int sus = poz[node];
  int p1 = find(node);
  int p2 = find(sus);
  if (p1 == p2) return;
  spoji(node, sus);
  dfs(sus);
}
vector<int> v[N];
void solve() {
  for (int i = 0; i < n; i++) b[i] = a[i];
  sort(b, b + n);
  for (int i = 0; i < n; i++) {
    M[b[i]] = i;
  }
  for (int i = 0; i < n; i++) {
    poz[i] = M[a[i]];
  }
  for (int i = 0; i < n; i++) parent[i] = i;
  for (int i = 0; i < n; i++) {
    if (bio[i] == 1) continue;
    dfs(i);
  }
  for (int i = 0; i < n; i++) find(i);
  int koji = 1;
  for (int i = 0; i < n; i++) {
    if (M2[parent[i]] == 0) {
      M2[parent[i]] = koji++;
    }
  }
  for (int i = 0; i < n; i++) {
    v[M2[parent[i]]].push_back(i + 1);
  }
  cout << koji - 1 << endl;
  for (int i = 1; i < koji; i++) {
    cout << v[i].size() << " ";
    for (int j = 0; j < v[i].size(); j++) cout << v[i][j] << " ";
    cout << endl;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  load();
  solve();
  return 0;
}
