#include <bits/stdc++.h>
using namespace std;
int T, n, len, f[101000];
vector<vector<int> > ans;
int l[100010], pos[100010], dp[100010], pre[100010];
vector<int> getlis(const vector<int> &s) {
  int mxlen = 0;
  l[0] = 0;
  pos[0] = -1;
  int anspos = -1;
  for (int i = 0; i < s.size(); i++) {
    int pos = lower_bound(l, l + mxlen + 1, s[i]) - l - 1;
    if (pos == mxlen) {
      mxlen++;
      l[mxlen] = s[i];
      ::pos[mxlen] = i;
      anspos = i;
    }
    dp[i] = pos + 1;
    pre[i] = ::pos[pos];
    if (s[i] < l[dp[i]]) {
      l[dp[i]] = s[i];
      ::pos[dp[i]] = i;
    }
  }
  vector<int> ret;
  int cur = anspos;
  while (cur != -1) {
    ret.push_back(cur);
    cur = pre[cur];
  }
  reverse(ret.begin(), ret.end());
  return ret;
}
vector<int> ds[100010];
int vl[100010];
void solve(vector<int> s) {
  int l = s.size();
  if (!l) return;
  vector<int> LIS = getlis(s);
  if (LIS.size() > f[l]) {
    vector<int> tl(LIS.size());
    for (int i = 0; i < LIS.size(); i++) tl[i] = s[LIS[i]];
    ans.push_back(tl);
    int pos = 0;
    vector<int> ts;
    for (int i = 0; i < l; i++) {
      if (pos < LIS.size() && i == LIS[pos])
        pos++;
      else
        ts.push_back(s[i]);
    }
    solve(ts);
  } else {
    fill(vl, vl + l, 0x3f3f3f3f);
    for (int i = 0; i < l; i++) ds[i].clear();
    for (int i = 0; i < l; i++) {
      int p = lower_bound(vl, vl + l, s[i]) - vl;
      vl[p] = s[i];
      ds[p].push_back(s[i]);
    }
    for (int i = 0; i < l; i++)
      if (!ds[i].empty()) ans.push_back(ds[i]);
  }
}
void solve() {
  scanf("%d", &n);
  vector<int> v(n);
  for (int i = 0; i < n; i++) scanf("%d", &v[i]);
  ans.clear();
  solve(v);
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++) {
    printf("%d ", ans[i].size());
    for (int j = 0; j < ans[i].size(); j++) printf("%d ", ans[i][j]);
    puts("");
  }
}
int main() {
  scanf("%d", &T);
  for (int i = 1; i <= 447; i++)
    for (int j = i * (i + 1) / 2; j < (i + 1) * (i + 2) / 2; j++) f[j] = i;
  while (T--) solve();
  return 0;
}
