至至子的长链剖分
题号:NC238644
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
Special Judge, 64bit IO Format: %lld

题目描述

对于 n 个节点有根树(点的编号从 1n),我们设节点 u 的“长链长度”为 h_u,其可以通过如下方式计算:



即对于叶子节点,其 h 值为 0,否则为所有儿子节点中最大的 h

现给定一棵树的 ,请还原该树的形态,或报告无解。如有多棵满足限制的树,输出任意一棵即可,详见输出格式。

其中,叶子节点指没有子节点的节点, 表示 u 节点的儿子节点构成的集合。

输入描述:

本题一个测试点内包含多组数据。

第一行一个正整数 T,表示数据组数,

每组数据的第一行包含一个正整数 n,表示树的节点数,保证

接下来一行 n 个整数 ,意义如上所述,保证

输出描述:

对于每组数据,按照如下格式输出:

如果无解,输出一行一个整数 -1 即可。

否则先在第一行输出根节点的编号 r。接下来输出 n-1 行,每行两个正整数 u,v,表示你构造的树内有连边 (u,v)。请保证你输出的是一棵树。
示例1

输入

复制
3
5
2 3 1 0 0 
6
1 1 0 0 0 0 
2
1 0

输出

复制
2
2 1
1 3
3 5
2 4
-1
1
1 2

说明

对于第一组数据,有下面几种(未列出全部)合法的方案:

第二组数据无解,故输出 -1

第三组数据只有一组解,树根为 1 且只有一条边 (1,2)