#include <bits/stdc++.h>
using namespace std;
inline int gi() {
  int data = 0, m = 1;
  char ch = 0;
  while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
  if (ch == '-') {
    m = 0;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    data = (data << 1) + (data << 3) + (ch ^ 48);
    ch = getchar();
  }
  return (m) ? data : -data;
}
int n, nA, nI, K, A[100005], q[100005], np, ps, cov[100005], ID[100005],
    f[100005];
vector<int> ans[100005];
struct Item {
  int vl, id;
  inline bool operator<(const Item &B) const {
    return vl ^ B.vl ? vl < B.vl : id < B.id;
  }
};
set<Item> S;
set<Item>::iterator it, pre;
inline void solve() {
  S.clear();
  nI = 0;
  for (int i = n; i >= 1; i--) {
    S.insert((Item){A[i], 0});
    it = S.find((Item){A[i], 0});
    if (it == S.begin()) {
      ++nI;
      S.erase(it);
      S.insert((Item){A[i], nI});
      ID[i] = nI;
    } else {
      pre = it;
      --pre;
      ID[i] = (*pre).id;
      S.erase(pre);
      S.erase(S.find((Item){A[i], 0}));
      S.insert((Item){A[i], ID[i]});
    }
  }
  for (int j = 1; j <= n; j++) ans[nA + ID[j]].push_back(A[j]);
  nA += nI;
  return;
}
inline void Work() {
  n = gi();
  for (int i = 1; i <= n; i++) A[i] = gi(), cov[i] = 0;
  nA = 0;
  K = 1;
  while (K * (K + 1) / 2 <= n) ++K;
  for (int i = 1; i <= K; i++) ans[i].clear();
  while (1989) {
    np = 0;
    ps = 0;
    for (int i = 1, p; i <= n; i++) {
      p = upper_bound(q + 1, q + np + 1, A[i]) - q;
      q[p] = A[i];
      f[i] = p;
      if (p > np) np = p;
      if (f[ps] < f[i]) ps = i;
    }
    if (f[ps] < K) {
      solve();
      break;
    }
    cov[ps] = K;
    for (int j = ps - 1; j >= 1; j--)
      if (f[j] == f[ps] - 1 && A[j] < A[ps]) ps = j, cov[ps] = K;
    ++nA;
    np = 0;
    for (int j = 1; j <= n; j++)
      if (cov[j] == K)
        ans[nA].push_back(A[j]);
      else
        q[++np] = A[j];
    if (!np) break;
    for (int j = 1; j <= np; j++) A[j] = q[j];
    n = np;
    --K;
  }
  printf("%d\n", nA);
  for (int i = 1; i <= nA; i++, puts("")) {
    printf("%d ", (int)ans[i].size());
    for (int j = 0, lt = ans[i].size(); j < lt; j++) printf("%d ", ans[i][j]);
  }
}
int main() {
  int Case = gi();
  while (Case--) Work();
  return 0;
}
