#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0;
  bool t = false;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') t = true, ch = getchar();
  while (ch <= '9' && ch >= '0') x = x * 10 + ch - 48, ch = getchar();
  return t ? -x : x;
}
vector<int> ans[500];
int n, k, a[100100], Ans;
int S[100100], top, b[100100], c[100100];
int lt[100100], nt[100100];
int LIS() {
  for (int i = 1; i <= top; ++i) b[i] = lt[i] = nt[i] = 0;
  S[top = 1] = 1e5 + 1;
  for (int i = 1; i <= n; ++i) {
    int pos = upper_bound(&S[1], &S[top + 1], a[i]) - S;
    S[pos] = a[i];
    lt[i] = b[pos];
    b[pos] = i;
    nt[i] = b[pos - 1];
    if (pos == top) S[++top] = 1e5 + 1;
  }
  return top - 1;
}
void Find(int x) {
  ans[++Ans].clear();
  for (int i = b[x]; i; i = nt[i]) ans[Ans].push_back(a[i]), a[i] = -1;
}
void Divide(int n) {
  for (int i = 1; i <= n; ++i) {
    ans[++Ans].clear();
    for (int j = b[i]; j; j = lt[j]) ans[Ans].push_back(a[j]);
  }
}
int main() {
  int T = read();
  while (T--) {
    n = read();
    Ans = 0;
    for (int i = 1; i <= n; ++i) a[i] = read();
    while (n) {
      int k = LIS();
      if (1ll * k * (k + 1) > 2 * n)
        Find(k);
      else {
        Divide(k);
        break;
      }
      int tot = 0;
      for (int i = 1; i <= n; ++i)
        if (a[i] != -1) a[++tot] = a[i];
      n = tot;
    }
    printf("%d\n", Ans);
    for (int i = 1; i <= Ans; ++i) {
      int l = ans[i].size();
      printf("%d ", l);
      for (int j = l - 1; ~j; --j) printf("%d ", ans[i][j]);
      puts("");
    }
  }
  return 0;
}
