#include <bits/stdc++.h>
using namespace std;
const int N = 100000 + 77, inf = 1000000077;
int q;
vector<int> Emp, G;
vector<vector<int> > A;
void Solve() {
  vector<int> V;
  V.swap(G);
  if (V.empty()) return;
  int n = int(V.size()) - 1;
  vector<int> f, W(n + 1), dp(n + 1), Par(n + 1);
  vector<bool> M(n + 1);
  for (int i = 0; i <= n; ++i) f.push_back(inf);
  int need = 0;
  while (need * (need + 1) / 2 <= n) ++need;
  --need;
  int Mx = 0;
  for (int i = 1; i <= n; ++i) {
    int id = lower_bound(f.begin(), f.end(), V[i]) - f.begin();
    if (id > 0) Par[i] = W[id - 1];
    dp[i] = id + 1;
    Mx = max(Mx, dp[i]);
    f[id] = V[i];
    W[id] = i;
  }
  if (Mx <= need) {
    vector<vector<int> > T;
    for (int i = 0; i <= Mx; ++i) T.push_back(Emp);
    for (int i = 1; i <= n; ++i) T[dp[i]].push_back(V[i]);
    for (auto F : T)
      if (!F.empty()) A.push_back(F);
    return;
  }
  for (int i = 1; i <= n; ++i) {
    if (dp[i] == Mx) {
      int p = i;
      while (p) {
        M[p] = 1;
        p = Par[p];
      }
      break;
    }
  }
  vector<int> T;
  G.clear();
  G.push_back(0);
  for (int i = 1; i <= n; ++i) {
    if (M[i])
      T.push_back(V[i]);
    else
      G.push_back(V[i]);
  }
  A.push_back(T);
  V.clear(), V.shrink_to_fit();
  f.clear(), f.shrink_to_fit();
  W.clear(), W.shrink_to_fit();
  dp.clear(), dp.shrink_to_fit();
  Par.clear(), Par.shrink_to_fit();
  M.clear(), M.shrink_to_fit();
  Solve();
}
inline void Query() {
  A.clear();
  int n;
  cin >> n;
  vector<int> P;
  P.emplace_back(0);
  for (int x, i = 1; i <= n; ++i) cin >> x, P.emplace_back(x);
  G.swap(P);
  Solve();
  cout << int(A.size()) << '\n';
  for (auto V : A) {
    cout << int(V.size()) << ' ';
    for (auto x : V) {
      cout << x << ' ';
    }
    cout << '\n';
  }
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> q;
  while (q--) Query();
  return 0;
}
