#include <bits/stdc++.h>
using namespace std;
long long ncr_2(long long n, long long k) {
  if (k > n) return 0;
  if (k * 2 > n) k = n - k;
  if (k == 0) return 1;
  long long result = n;
  for (long long i = 2; i <= k; ++i) {
    result = result * (n - i + 1);
    result /= i;
  }
  return result;
}
long long pow(int x, unsigned int y, int p) {
  int res = 1;
  x = x % p;
  if (x == 0) return 0;
  while (y > 0) {
    if (y & 1) res = (res * x) % p;
    y = y >> 1;
    x = (x * x) % p;
  }
  return res;
}
long long _pow(int a, int b) {
  if (!b) return 1;
  int temp = _pow(a, b / 2);
  temp = (temp * temp);
  if (b % 2) return (a * temp);
  return temp;
}
int invmod(int a, int m) { return pow(a, m - 2, m); }
long long feelthepower(long long x, long long y) {
  long long res = 1LL;
  while (y) {
    if (y & 1) {
      res = (res * 1LL * x) % 1000000007;
    }
    x = (x * 1LL * x) % 1000000007;
    y /= 2;
  }
  return res;
}
vector<int> Adj[100001], A;
int cnt = 0;
vector<bool> vis(100001, false);
void dfs(int s) {
  if (vis[s]) return;
  vis[s] = true;
  A.push_back(s);
  cnt++;
  for (auto v : Adj[s]) {
    if (!vis[v]) {
      dfs(v);
    }
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  int tc = 1;
  for (long long ti = 0; ti < tc; ti++) {
    int n;
    cin >> n;
    vector<int> V(n);
    map<int, int> mp;
    for (long long i = 0; i < n; i++) {
      cin >> V[i];
      mp[V[i]] = i + 1;
    }
    vector<int> vec(V);
    sort(vec.begin(), vec.end());
    for (long long i = 0; i < n; i++) {
      Adj[mp[vec[i]]].push_back(i + 1);
      Adj[i + 1].push_back(mp[vec[i]]);
    }
    vector<int> Store[100001];
    int j = 0, cnt1 = 0;
    for (int i = 1; i <= n; i++) {
      if (!vis[i]) {
        cnt = 0;
        dfs(i);
        Store[j].push_back(cnt);
        for (auto x : A) {
          Store[j].push_back(x);
        }
        A.clear();
        j++;
      }
    }
    cout << j << endl;
    for (long long i = 0; i < j; i++) {
      for (long long k = 0; k < Store[i].size(); k++) {
        cout << Store[i][k] << " ";
      }
      cout << endl;
    }
  }
}
