#include <bits/stdc++.h>
using namespace std;
struct info {
  int x, v, fi, fj;
  info() : x(1e8), v(0), fi(-1), fj(-1) {}
  info(int a, int b, int c, int d) : x(a), v(b), fi(c), fj(d) {}
  bool operator<(const info &o) const {
    if (x != o.x) return x < o.x;
    return v < o.v;
  }
  void min(const info &o) {
    if (o < *this) *this = o;
  }
  info get(int c, int o, int i, int j) { return {x + c, o, i, j}; }
};
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0);
  int t;
  cin >> t;
  while (t--) {
    int n;
    cin >> n;
    vector<int> a(n);
    for (auto &i : a) cin >> i;
    const int U = (1 << n) - 1;
    vector<vector<info>> dp(n + 1, vector<info>(U + 1));
    dp[0][U].x = 0;
    vector<int> sum(U + 1), bp(U + 1);
    for (int m = 0; m <= U; ++m)
      for (int k = 0; k < n; ++k)
        if (m >> k & 1) sum[m] += a[k], ++bp[m];
    for (int i = 0; i < n; ++i)
      for (int m = 0; m <= U; ++m) {
        dp[i + 1][m].min(dp[i][m]);
        if (m >> i & 1) {
          int mask = m ^ 1 << i;
          for (int s = mask;; s = (s - 1) & mask) {
            int ns = s | 1 << i;
            if (sum[ns] > dp[i][m].v)
              dp[i + 1][m ^ ns].min(dp[i][m].get(bp[s], sum[ns], i, m));
            if (s == 0) break;
          }
        }
      }
    int p = n, m = 0;
    vector<pair<int, int>> mov;
    for (int i, j; m != U;) {
      i = dp[p][m].fi;
      j = dp[p][m].fj;
      int mask = m ^ j ^ 1 << i;
      for (int k = 0; k < n; ++k)
        if (mask >> k & 1) mov.push_back({k, i});
      p = i;
      m = j;
    }
    int sz = mov.size();
    cout << sz << "\n";
    assert(dp[n][0].x == sz);
    for (int i = 0; i < sz; ++i) {
      cout << mov[i].first + 1 << " " << mov[i].second + 1 << "\n";
      for (int j = i + 1; j < sz; ++j) {
        if (mov[j].first > mov[i].first) --mov[j].first;
        if (mov[j].second > mov[i].first) --mov[j].second;
      }
    }
  }
  return 0;
}
