#---------------------------------------------------------------------------------
def print2D(S):
    for i in S:
        print(' '.join(map(str,i)))
#---------------------------------------------------------------------------------
# 检测value所在的i行,j列,ij所在3*3的粗线宫格是否已有重复数字,返回true时说明没有
def check(S,i,j,value):
    if value in S[i]:
        return False
    for ii in range(9):
        if value == S[ii][j]:
            return False
    ii = i//3*3
    jj = j//3*3
    for r in range(ii,ii+3):
        for c in range(jj,jj+3):
            if value == S[r][c]:
                return False
    return True
#---------------------------------------------------------------------------------
# 返回0值所有的行列,及长度
def ijzero(S):
    I = []
    J = []
    for i in range(9):
        for j in range(9):
            if S[i][j] == 0:
                I.append(i)
                J.append(j)
    return I,J,len(I)
#=================================================================================

input = ['0 9 2 4 8 1 7 6 3',
         '4 1 3 7 6 2 9 8 5',
         '8 6 7 3 5 9 4 1 2',
         '6 2 4 1 9 5 3 7 8',
         '7 5 9 8 4 3 1 2 6',
         '1 3 8 6 2 7 5 9 4',
         '2 7 1 5 3 8 6 4 9',
         '3 8 6 9 1 4 2 5 7',
         '0 4 5 2 7 6 8 3 1']

#S = []
#for i in range(9):
#    t = list(map(int,input().strip().split()))
#    S.append(t)

S = []
for i in range(9):
    t = list(map(int,input[i].strip().split()))
    S.append(t)

for i in range(4):
    for j in range(4):
        S[i][j] = 0
print2D(S)
#---------------------------------------------------------------------------------
# 返回0值所有的行列,及长度

I,J,n = ijzero(S)
value = [1,2,3,4,5,6,7,8,9]

res = []
def dfs(k, res):
    if k==n:                # 如达到最后一个节点
        #print(res)
        return res          # 返回第一个合法解,如无返回可打印所有合法解

    if 0<=k<=n-1:           # 限定搜索范围保证访问不越界
        i = I[k]            # 取行值
        j = J[k]            # 取列值
        for v in value:                         # 遍历当前节点每个候选解
            if check(S,i,j,v):                  # 检查当前节点当前候选解合法性
                S[i][j] = v                     # 如合法赋值
                solve_opt = dfs(k+1, res+[v])   # 递归进入下一个节点,第二个参数加入当前节点合法解。dfs()的返回值solve只有两种情况,
                if solve_opt:                   # 1、为空,说明下一个节点几个候选解check()都返回false,即本节点当前候选解不对,
                    return solve_opt            #    本节点要回溯执行下一个候选解,因此要恢复S[i][j]=0,对一下个候选解执行check()
                S[i][j] = 0                     # 2、不为空时,说明到达终点k==n,solve返回所有路径点res

solve_opt = dfs(0, res)
print('solve_opt=',solve_opt)
if solve_opt:
    print2D(S)
else:
    print('none')