#include<bits/stdc++.h>
using namespace std;
mt19937 gen(time(0));
uniform_int_distribution<int> dist(0, 1);
#define Rb() dist(gen)
const int dx[16] = {-1, -1, -1, 0, 0, 1, 1, 1, -2, -2, -1, -1, 1, 1, 2, 2}, dy[16] = {-1, 0, 1, -1, 1, -1, 0, 1, -1, 1, -2, 2, -2, 2, -1, 1};
#define mp(i, j) make_pair(i, j)
bool ti[2][9][9] = {
{
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0},
{1, 0, 0, 0, 0, 1, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 1},
{1, 1, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 1}
},
{
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 1, 0, 0, 1, 0},
{0, 0, 1, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 1, 0, 0},
{0, 1, 0, 1, 0, 0, 0, 1, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
}
};
struct state{
int p[9][9];
bool q[9][9][10];
bool totalcheck() const {
// 这里写变形数独条件
for (int i = 0;i < 9;++i)
for (int j = 0;j < 8;++j)
if (p[i][j] and p[i][j + 1]){
bool f = 1;
if (p[i][j] == 1) f = 0;
if (p[i][j + 1] == 1) f = 0;
if ((p[i][j] % p[i][j + 1]) and (p[i][j + 1] % p[i][j])) f = 0;
if (f xor ti[0][i][j]) return 0;
}
for (int i = 0;i < 8;++i)
for (int j = 0;j < 9;++j)
if (p[i][j] and p[i + 1][j]){
bool f = 1;
if (p[i][j] == 1) f = 0;
if (p[i + 1][j] == 1) f = 0;
if ((p[i][j] % p[i + 1][j]) and (p[i + 1][j] % p[i][j])) f = 0;
if (f xor ti[1][i][j]) return 0;
}
return 1;
}
int check(int &x, int &y) const {
int mcnt = 10;
for (int i = 0;i < 9;++i)
for (int j = 0;j < 9;++j)
if (!p[i][j]){
int cnt = 0;
for (int k = 1;k <= 9;++k)
cnt += q[i][j][k];
if (cnt == 0) return -1; // invalid
if (cnt < mcnt || (cnt == mcnt && Rb())) mcnt = cnt, x = i, y = j;
}
if (totalcheck()) return (mcnt == 10); // unfinished | finished
return -1;
}
void modify(int x, int y, int k){
p[x][y] = k;
int x_ = x / 3 * 3, y_ = y / 3 * 3;
for (int i = 0;i < 9;++i)
q[i][y][k] = q[x][i][k] = q[x_ + i / 3][y_ + i % 3][k] = 0;
// 无士,无马 :
// for (int i = 0;i < 8;++i)
// if (x + dx[i] >= 0 && x + dx[i] < 9 && y + dy[i] >= 0 && y + dy[i] < 9)
// q[x + dx[i]][y + dy[i]][k] = 0;
// 配对:
// for (int i = 0;i < cplen;++i)
// for (int j = 0;j < 2;++j)
// if (p[cp[i][j].first][cp[i][j].second])
// for (int k = 1;k <= 9;++k)
// if (p[cp[i][j].first][cp[i][j].second] != k)
// q[cp[i][1-j].first][cp[i][1-j].second][k] = 0;
}
void init(){
memset(p, 0, sizeof(p));
memset(q, 1, sizeof(q));
}
void input(){
memset(p, 0, sizeof(p));
memset(q, 0, sizeof(q));
for (int i = 0;i < 9;++i)
for (int j = 0;j < 9;++j){
string st;
cin >> st;
if (st[0] == '`'){
for (int k = 1;k <= 9;++k)
q[i][j][k] = 1;
for (int i = 1;i < (int)st.length();++i)
q[i][j][st[i] - '0'] = 0;
}
else {
if (st.length() == 1) p[i][j] = st[0] - '0';
for (char ch : st)
q[i][j][ch - '0'] = 1;
}
}
for (int i = 0;i < 9;++i)
for (int j = 0;j < 9;++j)
if (p[i][j])
modify(i, j, p[i][j]);
}
void output() const {
for (int i = 0;i < 9;++i){
for (int j = 0;j < 9;++j){
printf ("%d", p[i][j]);
}
puts("");
}
puts("");
}
};
long long cnt = 0;
state cov;
void dfs(const state &st){
// if ((cnt & 1048575) == 0)
// printf ("cnt: %lld\n", cnt);
// ++cnt;
st.output();
system("cls");
int x, y;
int f = st.check(x, y);
if (f == -1) return ;
if (f == 1){
st.output();
for (int i = 0;i < 9;++i)
for (int j = 0;j < 9;++j)
cov.q[i][j][st.p[i][j]] = 1;
return ;
}
for (int k = 1;k <= 9;++k)
if (st.q[x][y][k]){
state temp = st;
temp.modify(x, y, k);
dfs(temp);
}
}
int main(){
// freopen("sudoku1.txt", "w", stdout);
state st;
st.input();
// st.init();
dfs(st);
printf ("cov:\n");
for (int i = 0;i < 9;++i){
for (int j = 0;j < 9;++j){
for (int k = 1;k <= 9;++k)
if (cov.q[i][j][k])
printf ("%d", k);
printf (" ");
}
printf ("\n");
}
return 0;
}