#include<cstdio>
#define N 1000100
#include<queue>
#define FOR(a,b,c) for(register int a=b;a<=c;++a)
using namespace std;
long long val[N],LG;
int lg[N],n,fr;
struct nod
{
nod *l,*r;
long long fre;
int ind;
nod() {}
nod(int _ind,long long _fre,nod* _l,nod *_r)
{
ind=_ind;
fre=_fre;
l=_l;
r=_r;
}
};
nod *M[2];
queue<nod* > q,c;
void dfs(nod* x,int lvl,long long va)
{
if(x->ind)
{
lg[x->ind]=lvl;
val[x->ind]=va;
LG+=x->fre*lvl;
return;
}
if(x->l)
dfs(x->l,lvl+1,va<<1);
if(x->r)
dfs(x->r,lvl+1,(va<<1)+1);
}
int main ()
{
freopen("huffman.out","w",stdout);
freopen("huffman.in","r",stdin);
scanf("%d",&n);
FOR(i,1,n)
{
scanf("%d",&fr);
c.push(new nod(i,fr,NULL,NULL));
}
FOR(i,1,n-1)
{
FOR(j,0,1)
{
if(c.size()&&(!q.size()||c.front()->fre<=q.front()->fre))
M[j]=c.front(),c.pop();
else
M[j]=q.front(),q.pop();
}
q.push(new nod(0,M[0]->fre+M[1]->fre,M[0],M[1]));
}
dfs(q.front(),0,0);
printf("%lld\n",LG);
FOR(i,1,n)
printf("%d %lld\n",lg[i],val[i]);
return 0;
}