#include<stdio.h>
#define max 100
typedef struct
{
char data;
int weight;
int lchild;
int rchild;
int parent;
}htnode;
void creat(htnode ht[],int n0)
{
int i;
for(i=0;i<2*n0-1;i++)
ht[i].parent=ht[i].lchild=ht[i].rchild=-1;//创建空哈夫曼树
for(i=n0;i<2*n0-1;i++)//给哈夫曼树赋值
{
int rmin,lmin;
int lnode,rnode;
lnode=rnode=-1;
lmin=rmin=6666;//找最小权重用,lmin左,rmin右
for(int j=0;j<i;j++)
if(ht[j].parent==-1)//没爸的孩子(>-<)
{
if(lmin>ht[j].weight)
{
rmin=lmin;rnode=lnode;
lmin=ht[j].weight;lnode=j;
}
else if(rmin>ht[j].weight)
{
rmin=ht[j].weight;rnode=j;
}
}
ht[i].weight=ht[lnode].weight+ht[rnode].weight;
ht[i].lchild=lnode;ht[i].rchild=rnode;
ht[lnode].parent=ht[rnode].parent=i;
}
}
void htcode(htnode ht[],int n0,char code[max][max])
{
int i,k=0,j,k1;
char code1[max];
int parent,child;
for(i=0;i<n0;i++)
{
k=0;
parent=ht[i].parent;
child=i;
while(parent!=-1)
{
if(ht[parent].lchild==child)
code1[k++]='0';
else
code1[k++]='1';
child=parent;
parent=ht[parent].parent;
}
k1=0;
for(j=k-1;j>=0;j--)
{
code[i][k1++]=code1[j];
}
code[i][k1]='\0';
}
}
int main()
{
char code[max][max];
htnode ht[max];
int n0,i;
while(1)
{
scanf("%d",&n0);
fflush(stdin);
for(i=0;i<n0;i++)
{
scanf("%c%d",&ht[i].data,&ht[i].weight);
fflush(stdin);
}
creat(ht,n0);
htcode(ht,n0,code);
for(i=0;i<n0;i++)
printf("%c--->%s\n",ht[i].data,code[i]);
}
return 0;
}