You are given a sequence D_1, D_2, ..., D_N of length N. The values of D_i are all distinct. Does a tree with N vertices that satisfies the following conditions exist?

* The vertices are numbered 1,2,..., N.
* The edges are numbered 1,2,..., N-1, and Edge i connects Vertex u_i and v_i.
* For each vertex i, the sum of the distances from i to the other vertices is D_i, assuming that the length of each edge is 1.



If such a tree exists, construct one such tree.

Constraints

* 2 \leq N \leq 100000
* 1 \leq D_i \leq 10^{12}
* D_i are all distinct.

Input

Input is given from Standard Input in the following format:


N
D_1
D_2
:
D_N


Output

If a tree with n vertices that satisfies the conditions does not exist, print `-1`.

If a tree with n vertices that satisfies the conditions exist, print n-1 lines. The i-th line should contain u_i and v_i with a space in between. If there are multiple trees that satisfy the conditions, any such tree will be accepted.

Examples

Input

7
10
15
13
18
11
14
19


Output

1 2
1 3
1 5
3 4
5 6
6 7


Input

2
1
2


Output

-1


Input

15
57
62
47
45
42
74
90
75
54
50
66
63
77
87
51


Output

1 10
1 11
2 8
2 15
3 5
3 9
4 5
4 10
5 15
6 12
6 14
7 13
9 12
11 13
/*
一个点从u移到相邻节点v时，若删掉(u,v)后u这边的连通块大小为sizu，v这边的连通块大小为sizv，那么dv=du−sizv+sizu
所以考虑按d从大到小（也就是从叶子向上，这样能得到正确的siz）的顺序确定每个点x的父亲：这个点的d必须是dx−(n−sizx)+sizx
然后判一下根
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
int n, v2[N], fa[N], sz[N];
long long v[N], ds[N];
map<long long, int> tp;
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++)
    scanf("%lld", &v[i]), tp[v[i]] = v2[i] = i, sz[i] = 1;
  sort(v2 + 1, v2 + n + 1, [&](int a, int b) {return v[a] < v[b];});
  for (int i = n; i > 1; i--) {
    long long tp2 = v[v2[i]] - n + sz[v2[i]] * 2;
    if (!tp[tp2]) return 0 & puts("-1");
    int sb = tp[tp2];
    ds[sb] += ds[v2[i]] + sz[v2[i]];
    sz[sb] += sz[v2[i]];
    fa[v2[i]] = sb;
  }
  if (ds[v2[1]] != v[v2[1]]) {printf("-1\n"); return 0;}
  for (int i = 1; i <= n; i++)if (fa[i])
      printf("%d %d\n", i, fa[i]);
  return 0;
}