#include "stdio.h"
#include "malloc.h"
#define NMAX 200001
struct nod{
long inf;
long f[2];
};
struct codare{
long COD;
long LUNG;
};
typedef struct nod nod;
typedef struct codare codare;
void push(long x, long *H, nod *A)
{
long aux;
while (x > 1 && A[H[x]].inf < A[H[x/2]].inf)
{
aux=H[x];
H[x]=H[x/2];
H[x/2]=aux;
/*P[H[x]]=x;
P[H[x/2]]=x/2;
*/
x/=2;
}
}
void sift_down(long *H,long i,long l,nod *A)
{
long fiu = i,aux;
if (2*i <=l && A[H[2*i]].inf < A[H[i]].inf)
fiu = 2*i;
if (2*i+1 <=l && A[H[2*i+1]].inf < A[H[fiu]].inf)
fiu = 2*i+1;
if (i!=fiu)
{
aux = H[fiu];
H[fiu] = H[i];
H[i] = aux;
sift_down(H,fiu,l,A);
}
}
void dsf(nod *A,codare *C,long start,long *cost,long cod,long dim)
{
if (A[start].f[0] != 0 && A[start].f[1] != 0)
{
(*cost) += A[start].inf;
dsf(A,C,A[start].f[0],&(*cost),cod << 1,dim + 1);
dsf(A,C,A[start].f[1],&(*cost),(cod << 1) + 1, dim + 1);
}
else
{
C[start].COD = cod;
C[start].LUNG = dim;
}
}
int main()
{
long i,n, *H, cost = 0, l = 0, m, min1, min2;
nod *A;
codare *C;
freopen("huffman.in","r",stdin);
freopen("huffman.out","w",stdout);
scanf("%ld",&n);
H = (long*)calloc(n+1,sizeof(long));
A = (struct nod*)calloc(2*n+1,sizeof(nod));
C = (struct codare*)calloc(n+1,sizeof(codare));
for (i = 1; i <= n; i++)
{
scanf("%ld",&A[i].inf);
l++;
H[l] = i;
push(l,H,A);
A[i].f[0] = 0;
A[i].f[1] = 0;
}
m = n;
while (l >= 2)
{
min1 = H[1];
H[1] = H[l];
l--;
sift_down(H,1,l,A);
min2 = H[1];
H[1] = H[l];
l--;
sift_down(H,1,l,A);
A[++n].inf = A[min1].inf + A[min2].inf;
A[n].f[0] = min1;
A[n].f[1] = min2;
H[++l] = n;
push(l,H,A);
}
dsf(A,C,n,&cost,0,0);
printf("%d\n",cost);
for (i = 1; i <= m; i++)
printf("%d %d\n",C[i].LUNG,C[i].COD);
return 0;
}