#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 50;
int T, n, m, a[N], ct, c[N];
set<pair<int, int> > S;
vector<int> ans[N];
void add(int x, int v) {
  for (; x <= n; x += x & -x) c[x] = max(c[x], v);
}
int ask(int x) {
  int ans = 0;
  for (; x; x -= x & -x) ans = max(ans, c[x]);
  return ans;
}
void upt(int z) {
  ans[++ct].push_back(a[z]);
  S.insert(pair<int, int>(a[z], ct));
}
void work(const vector<int> &b) {
  if (b.empty()) return;
  int n = b.size(), k = 1;
  for (; k * (k + 1) / 2 <= n; k++)
    ;
  --k;
  static int dp[N];
  memset(c, 0, m + 1 << 2);
  for (int i = 0; i < n; i++) {
    int t = a[b[i]];
    add(t, dp[i] = ask(t) + 1);
  }
  int len = ask(m);
  if (len > k) {
    vector<int> nxt;
    ans[++ct].resize(len);
    for (int i = n - 1, z = 0; ~i; i--)
      if (dp[i] + z == len && (!z || a[b[i]] < ans[ct][z - 1]))
        ans[ct][z++] = a[b[i]];
      else
        nxt.push_back(b[i]);
    reverse(nxt.begin(), nxt.end());
    reverse(ans[ct].begin(), ans[ct].end());
    work(nxt);
    return;
  }
  S.clear();
  upt(b[0]);
  for (int i = 1; i < n; i++) {
    auto z = S.lower_bound(pair<int, int>(a[b[i]], 0));
    if (z == S.end())
      upt(b[i]);
    else {
      int c = z->second;
      S.erase(z);
      S.insert(pair<int, int>(a[b[i]], c));
      ans[c].push_back(a[b[i]]);
    }
  }
}
void Main() {
  cin >> n;
  m = n;
  vector<int> b;
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b.push_back(i);
  work(b);
  cout << ct << '\n';
  for (int i = 1; i <= ct; i++) {
    cout << ans[i].size() << " ";
    for (auto z : ans[i]) cout << z << " ";
    puts("");
    ans[i].clear();
  }
  ct = 0;
}
int main() {
  cin >> T;
  while (T--) Main();
  return 0;
}
