#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
#define lesgooo ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define lop(i, n) for(ll i = 0; i < (ll)n; i++)
#define alop(i,v) for(auto &i: v)
#define ll long long
#define ld long double
//#define endl '\n'
#define all(v) v.begin(),v.end()
#define mem(dp, x) memset(dp, x, sizeof(dp))
#define sq(x) ((x) * (x))
#define pb push_back
using namespace std;
const ll mod = 1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

ll random(ll l, ll r) {
    return uniform_int_distribution<ll>(l, r)(rng);
}

typedef unsigned long long ull;

ull modmul(ull a, ull b, ull M) {
    ull ret = a * b - M * ull(1.L / M * a * b);
    return ret + M * (ret < 0) - M * (ret >= (ll)M);
}
ull modpow(ull b, ull e, ull mod) {
    ull ans = 1;
    for (;e; b = modmul(b, b, mod), e /= 2) {
        if (e & 1) ans = modmul(ans, b, mod);
    }
    return ans;

}
void dfs(int node, vector<pair<int,int>>&edges,  vector<vector<int>>&adj ) {
    for (auto x:adj[node]) {
        edges.push_back({node,x});
        dfs(x,edges,adj);
    }
}
int main() {
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    ll t; cin >> t;
    while (t--) {
        ll n; cin >> n;
        vector<int>m(n);
        priority_queue<pair<int,int>> pq;
        for (int i = 0;i<n;i++) {
            cin>>m[i];
            if (m[i] > 0) pq.push({m[i],i});
        }
        vector<vector<int>>adj(n);
        vector<int>par(n);
        int rt = -1;
        int prev = -1;
        while (!pq.empty()) {
            pair<int,int> pr = pq.top();
            pq.pop();
            if (rt == -1) {rt =pr.second; prev = rt; par[rt] = -1;}
            else {
                int nd = pr.second;
                par[nd] = prev;
                adj[prev].push_back(nd);
                prev = nd;
            }
        }
        vector<bool>vis(n,0);
        int st = 0;
        int node = prev;
        while (node != -1) {
            for (int i = st; i<m[node];i++) {
                if (i == node) {vis[i] = 1; continue;}
                if (!vis[i]) {
                    adj[node].push_back(i);
                    par[i] = node;
                    vis[i] = 1;
                }
            }
            st = m[node];
            node = par[node];
        }
        cout<<rt<<'\n';
        vector<pair<int,int>>edges;
        dfs(rt,edges,adj);
        for (auto x:edges) cout<<x.first<<" "<<x.second<<'\n';
    }
}

