#include<bits/stdc++.h>
using namespace std;
const int N=30;
int n;
char mp[N][N*2];
struct node
{
int num;
int cnt;
}g[260];
bool cmp(node a,node b)
{
if(a.cnt!=b.cnt)
{
return a.cnt>b.cnt;
}
return a.num<b.num;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n*2;j++)
{
cin>>mp[i][j];
}
}
for(int i=0;i<255;i++)
{
g[i].num=i;
g[i].cnt=0;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
string s="";
s+=mp[i][j*2-1];
s+=mp[i][j*2];
int num=0;
if(s[0]>='A')
{
num+=s[0]-'A'+10;
}
else
{
num+=s[0]-'0';
}
num*=16;
if(s[1]>='A')
{
num+=s[1]-'A'+10;
}
else
{
num+=s[1]-'0';
}
g[num].cnt++;
}
}
sort(g,g+255,cmp);
for(int i=0;i<16;i++)
{
string s="";
int x=g[i].num;
while(x>0)
{
int a=x%16;
if(a>9)
{
s=char(a-10+'A')+s;
}
else
{
s=char(a+'0')+s;
}
x/=16;
}
cout<<s;
}
cout<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
string s="";
s+=mp[i][j*2-1];
s+=mp[i][j*2];
int num=0;
if(s[0]>='A')
{
num+=s[0]-'A'+10;
}
else
{
num+=s[0]-'0';
}
num*=16;
if(s[1]>='A')
{
num+=s[1]-'A'+10;
}
else
{
num+=s[1]-'0';
}
int ans;
int minn=0x3f3f3f3f;
for(int k=0;k<16;k++)
{
if(minn>abs(g[k].num-num))
{
minn=abs(g[k].num-num);
ans=k;
}
}
if(ans<10)
{
cout<<ans;
}
else
{
cout<<char(ans-10+'A');
}
}
cout<<endl;
}
return 0;
}