#include <bits/stdc++.h>
using namespace std;
const double pi = 3.14159265358979323846;
#pragma GCC optimize("-O2")
template <class T>
using min_heap = priority_queue<T, std::vector<T>, std::greater<T> >;
const int LM = 1e6;
const int INF = 2e9;
int n, cn;
int g(int n) {
  int x;
  for (int i = 1; i <= n; i++) {
    if ((i * (i + 1)) / 2 > n) {
      return i - 1;
    }
  }
}
void antichain_decompose(vector<int> a, vector<int> ans[]) {
  int n = int(a.size()), pcn = 0;
  vector<int> pans[n + 2];
  set<pair<int, int> > s;
  for (int x : a) {
    pair<int, int> u = {x, -INF};
    auto it = s.upper_bound(u);
    if (it == s.end()) {
      pans[pcn].push_back(x);
      s.insert({x, pcn});
      pcn++;
    } else {
      int ps = it->second;
      pans[ps].push_back(x);
      s.erase(it);
      s.insert({x, ps});
    }
  }
  for (int i = 0; i <= pcn - 1; i++) {
    for (int x : pans[i]) {
      ans[cn].push_back(x);
    }
    cn++;
  }
}
vector<int> lis(vector<int> v) {
  int n = int(v.size());
  int a[n + 2], d[n + 2], f[n + 2], ans = 0;
  for (int i = 0; i <= n - 1; i++) {
    a[i + 1] = v[i];
  }
  for (int i = 1; i <= n; i++) {
    f[i] = lower_bound(d + 1, d + ans + 1, a[i]) - d;
    ans = max(ans, f[i]);
    d[f[i]] = a[i];
  }
  vector<int> t;
  int reqd = ans;
  for (int i = n; i >= 1; i--) {
    if (f[i] == reqd) {
      t.push_back(a[i]);
      reqd--;
    }
  }
  reverse(t.begin(), t.end());
  return t;
}
void solve(vector<int> a, vector<int> ans[]) {
  vector<int> b, c;
  while (!a.empty()) {
    b = lis(a);
    int n = int(a.size());
    int t = g(n);
    if (int(b.size()) <= t) {
      antichain_decompose(a, ans);
      break;
    } else {
      for (auto x : b) {
        ans[cn].push_back(x);
      }
      cn++;
      int ps = 0;
      for (int x : b) {
        while (1) {
          if (a[ps] != x) {
            c.push_back(a[ps]);
            ps++;
          } else {
            ps++;
            break;
          }
        }
      }
      for (int i = ps; i <= n - 1; i++) {
        c.push_back(a[i]);
      }
      a = c;
      b.clear();
      c.clear();
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cout.tie(0);
  cin.tie(0);
  int ts;
  cin >> ts;
  while (ts--) {
    cn = 0;
    cin >> n;
    vector<int> a;
    vector<int> ans[n + 2];
    for (int i = 1; i <= n; i++) {
      int x;
      cin >> x;
      a.push_back(x);
    }
    solve(a, ans);
    cout << cn << endl;
    for (int i = 0; i <= cn - 1; i++) {
      cout << int(ans[i].size()) << " ";
      for (auto u : ans[i]) cout << u << " ";
      cout << endl;
      ;
    }
  }
}
