#include<bits/stdc++.h>
#define maxn 100005
#define error {puts("-1");return 0;}
#define ll long long
using namespace std;

map <ll,int> mp;

struct edge{
	int to,nxt;
}e[maxn<<1];

struct node{
	ll dis;int id;
	bool operator < (const node &A) const {return dis>A.dis;}
}a[maxn];

struct uv{
	int u,v;
	bool operator < (const uv &A) const {return u==A.u?v<A.v:u<A.u;}
}ans[maxn];

int cnt,head[maxn],n;ll dis[maxn],size[maxn];

void add(int u,int v){
	e[++cnt]=(edge){v,head[u]};
	head[u]=cnt;
}

void dfs(int u,int fa,int dep){
	dis[a[n].id]+=dep;size[u]=1;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==fa) continue;
		dfs(v,u,dep+1);
		size[u]+=size[v];
	}
}

void dfs(int u,int fa){
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==fa) continue;
		dis[v]=dis[u]+n-size[v]*2;
		dfs(v,u);
	}
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i].dis);
		a[i].id=i;
		mp[a[i].dis]=i;
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++) size[i]=1;
	for(int i=1;i<n;i++){
		int u=a[i].id;
		ll tmp=n-size[u]*2;
		if(tmp<=0||!mp.count(a[i].dis-tmp)) error
		int fa=mp[a[i].dis-tmp];
		size[fa]+=size[u];
		add(u,fa);add(fa,u);
		ans[i].u=min(u,fa);
		ans[i].v=max(u,fa);
	}
	sort(ans+1,ans+n);
	dfs(a[n].id,0,0);
	dfs(a[n].id,0);
	for(int i=1;i<=n;i++) if(dis[a[i].id]!=a[i].dis) error
	for(int i=1;i<n;i++) printf("%d %d\n",ans[i].u,ans[i].v);
}