#include <bits/stdc++.h>
using namespace std;
int const N = 100000;
int n, x[N], pa[N + 1], inc[N], bi[N], li, idi[N], dp[N + 1], mxln[N];
vector<vector<int> > out;
int P(int v) { return pa[v] < 0 ? v : pa[v] = P(pa[v]); }
void fli() {
  li = 0;
  for (int i = P(0); i < n; i = P(i + 1)) {
    int z = lower_bound(inc, inc + li, x[i]) - inc;
    if (z == li)
      inc[li] = x[i], idi[li++] = i;
    else
      inc[z] = x[i], idi[z] = i;
    bi[i] = z == 0 ? -1 : idi[z - 1];
    mxln[i] = z + 1;
  }
}
inline void kl(int v[], int ln, int bk[]) {
  int z = ln - 1, k = v[ln - 1];
  out.push_back(vector<int>(ln));
  while (k >= 0) {
    out.back()[z--] = x[k];
    pa[k] = P(k + 1);
    k = bk[k];
  }
}
inline void klkl(int ln) {
  for (int i = 0; i < (int)(ln); ++i) out.push_back(vector<int>());
  for (int i = P(0); i < n; i = P(i + 1))
    out[out.size() - mxln[i]].push_back(x[i]);
}
void solve() {
  scanf("%d", &n);
  for (int i = 0; i < (int)(n); ++i) scanf("%d", x + i);
  for (int i = 0; i < (int)(n + 1); ++i) pa[i] = -1;
  out.clear();
  int sz = n;
  while (sz) {
    fli();
    if (dp[sz] > dp[sz - li])
      kl(idi, li, bi);
    else {
      klkl(li);
      break;
    }
    sz -= out.back().size();
  }
  printf("%d\n", (int)out.size());
  for (int i = 0; i < (int)(out.size()); ++i) {
    printf("%d", (int)out[i].size());
    for (int j = 0; j < (int)(out[i].size()); ++j) printf(" %d", out[i][j]);
    printf("\n");
  }
}
int main() {
  for (int i = 1; i < (int)(N + 1); ++i)
    for (int j = max(0, i - 1000); j < (int)(i); ++j)
      dp[i] = max(dp[i], min(i - j, dp[j] + 1));
  int t;
  scanf("%d", &t);
  while (t--) solve();
}
