#include <bits/stdc++.h>
const int INF = 1e9;
const int MOD = 1e9 + 7;
const long long LINF = 1e18;
using namespace std;
template <typename T>
void print(const vector<T> &x) {
  int n = x.size();
  for (int i = 0; i < (n); ++i) {
    cout << x[i];
    if (i != n - 1)
      cout << " ";
    else
      cout << endl;
  }
}
template <typename T>
void print(const vector<vector<T>> &x) {
  int n = x.size();
  for (int i = 0; i < (n); ++i) {
    for (int j = 0; j < (x[i].size()); ++j) {
      cout << x[i][j] << " ";
    }
    cout << endl;
  }
}
template <typename T>
void print(const vector<T> &x, int n) {
  for (int i = 0; i < (n); ++i) {
    cout << x[i];
    if (i != n - 1)
      cout << " ";
    else
      cout << endl;
  }
}
template <typename T>
void print(const vector<vector<T>> &x, int n, int m) {
  for (int i = 0; i < (n); ++i) {
    for (int j = 0; j < (m); ++j) {
      cout << x[i][j] << " ";
    }
    cout << endl;
  }
}
template <class T>
inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
void input_init() {
  cin.tie(0);
  ios::sync_with_stdio(false);
}
class union_find {
 private:
  vector<long long> par;
  vector<long long> ran;
  vector<long long> m_size;

 public:
  union_find(long long n);
  long long find(long long x);
  void unite(long long x, long long y);
  bool same(long long x, long long y);
  long long size(long long x);
};
union_find::union_find(long long n) {
  par.resize(n);
  ran.resize(n, 0);
  m_size.resize(n, 1);
  for (int i = 0; i < (n); ++i) par[i] = i;
};
long long union_find::find(long long x) {
  if (par[x] == x)
    return x;
  else
    return par[x] = find(par[x]);
};
void union_find::unite(long long x, long long y) {
  x = find(x);
  y = find(y);
  if (x == y) return;
  long long t = size(x) + size(y);
  m_size[x] = m_size[y] = t;
  if (ran[x] < ran[y]) {
    par[x] = y;
  } else {
    par[y] = x;
    if (ran[x] == ran[y]) ran[x]++;
  }
};
long long union_find::size(long long x) {
  if (par[x] == x) return m_size[x];
  return size(par[x] = find(par[x]));
}
bool union_find::same(long long x, long long y) {
  return (find(x) == find(y));
};
int main(int argc, char const *argv[]) {
  input_init();
  int n;
  cin >> n;
  vector<long long> a(n);
  for (int i = 0; i < (n); ++i) cin >> a[i];
  vector<long long> b(a);
  map<long long, int> mp;
  sort(b.begin(), b.end());
  for (int i = 0; i < (n); ++i) mp[b[i]] = i;
  union_find uf(n);
  map<long long, vector<int>> ans;
  for (int i = 0; i < (n); ++i) {
    uf.unite(i, mp[a[i]]);
  }
  for (int i = 0; i < (n); ++i) {
    ans[uf.find(i)].push_back(i);
  }
  cout << ans.size() << endl;
  for (auto &&e : ans) {
    cout << e.second.size() << ' ';
    for (auto &&f : e.second) cout << f + 1 << ' ';
    cout << endl;
  }
  return 0;
}
