#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
#define MAXSIZE 100
typedef struct{
double weight;
int parent,lc,rc;
}TNode,*HFMTree;
typedef char** HFMCode;
void Select(HFMTree T,int k,int &s1,int &s2){
double min = MAXSIZE;
for(int i=1;i<=k;i++){
if(T[i].parent==0 && T[i].weight<min){
min = T[i].weight;
s1 = i;
}
}
min = MAXSIZE;
for(int i=1;i<=k;i++){
if(i!=s1 && T[i].parent==0 && T[i].weight<min){
min = T[i].weight;
s2 = i;
}
}
}
void HFMCoding(HFMTree &T,HFMCode &C,double w[],int n){
if(n<=1)
return;
int m = 2*n-1;
int i,s1,s2;
HFMTree p = NULL;
T = new TNode[m+1];
for(p=T+1,i=1 ; i<=n ; ++i,++p,++w){
p->weight = *w;
p->lc = 0;
p->rc = 0;
p->parent = 0;
}
for( ; i<=m ; ++i,++p){
p->weight = 0;
p->lc = 0;
p->rc = 0;
p->parent = 0;
}
for(i=n+1;i<=m;++i){
Select(T,i-1,s1,s2);
T[s1].parent = i;
T[s2].parent = i;
T[i].lc = s1;
T[i].rc = s2;
T[i].weight = T[s1].weight+T[s2].weight;
}
C = new char*[n+1];
char *cd = new char[n];
cd[n-1] = '\0';
for(i=1;i<=n;i++){
int start=n-1;
for(int c=i,f=T[i].parent ; f!=0 ; c=f,f=T[f].parent)
if(T[f].lc==c)
cd[--start] = '0';
else
cd[--start] = '1';
C[i-1] = new char[n-start];
strcpy(C[i-1],&cd[start]);
}
delete cd;
}
int main(){
int n;
cin>>n;
char s[20];
cin>>s;
double w[20];
for(int i=0;i<n;i++)
cin>>w[i];
HFMCode C;
HFMTree T;
HFMCoding(T,C,w,n);
for(int i=0;i<n;i++){
cout<<"The "<<s[i]<<" 's Huffman code is:"<<C[i]<<endl;
}
}