#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=9,M=1<<N;
int ones[M],map[M];
int row[N],col[N],cell[3][3];
char str[100];
void init()
{
for(int i=0;i<N;i++)
row[i]=col[i]=(1<<N)-1;
//九宫格
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
cell[i][j]=(1<<N)-1;
}
void draw(int x,int y,int t,bool is_set)
{
if(is_set)
str[x*N+y]='1'+t;
else str[x*N+y]='.';
int v=1<<t; ///????
if(!is_set) v=-v;
row[x]-=v;
col[y]-=v;
cell[x/3][y/3]-=v;
}
//返回最后一个1所表示的十进制数
int lowbit(int x)
{
return x&-x;
}
//(x,y)整个点上可以填哪些数,返回的还是二进制由0和1组成
int get(int x,int y)
{
return row[x]&col[y]&cell[x/3][y/3];
}
bool dfs(int cnt)
{
if(!cnt) return true; //没有为. 的空格了,
int minv=10;
int x,y;
//选取最小的决策
//循环整个矩阵
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
if(str[i*N+j]=='.')
{
int state=get(i,j);
if(ones[state]<minv)
{
minv=ones[state];
x=i,y=j;
}
}
//这个位置可以填的数
int state=get(x,y);
for(int i=state;i;i-=lowbit(i)) //遍历为1的数
{
int t=map[lowbit(i)]; //需要填t这个数
draw(x,y,t,true);
if(dfs(cnt-1)) return true;
draw(x,y,t,false);
}
return false;
}
int main()
{
//最低位的1是在第几位
for(int i=0;i<N;i++) map[1<<i]=i;
//判断一个数有几个1.
for(int i=0;i<1<<N;i++)
for(int j=0;j<N;j++)
ones[i]+=i>>j&1;
while(cin>>str,str[0]!='e')
{
init();
int cnt=0;
for(int i=0,k=0;i<N;i++)
for(int j=0;j<N;j++,k++)
if(str[k]!='.')
{
int t=str[k]-'1'; //char转换为int
draw(i,j,t,true);
}
else cnt++;
dfs(cnt);
puts(str);
}
return 0;
}