#!/usr/bin/env python3
import random
import pycosat
import itertools

def entryToVariable(i, j ,v):
    assert(v > 0)
    return 81*i+9*j+v

def exactlyOne(l):
   return [ l ] + [ [-l[i], -l[j]] for i in range(len(l)) for j in range(i+1,len(l))]

def toChar(n):
    if n == 0:
        return " "
    return str(n)

def printSudoku(s):
    print("╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗")
    for i in range(9):
        if i % 3 == 0 and i > 1:
            print("╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣")
        elif i > 0:
            print("╟───┼───┼───╫───┼───┼───╫───┼───┼───╢")
        #print("║   │   │   ║   │   │   ║   │   │   ║")
        for j in range(9):
            if j % 3 == 0:
                print("║ " + toChar(s[i][j]) + " ",end="")
            else:
                print("│ " + toChar(s[i][j]) + " ",end="")
        print("║")
        #print("║\n║   │   │   ║   │   │   ║   │   │   ║")
    print("╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝")

def printSudokuInline(s):
    for i in range(9):
        for j in range(9):
            print(str(s[i][j]), end="")
    print()

def sudokuFromString(s):
    return [[int(s[9*i+j]) for j in range(9)] for i in range(9)]

def _build_base_cnf():
    rows = [[entryToVariable(i,j,v+1) for j in range(9)] for i in range(9) for v in range(9)]
    cols = [[entryToVariable(i,j,v+1) for i in range(9)] for j in range(9) for v in range(9)]
    blocks = [[entryToVariable(i-i%3+j//3,3*(i % 3)+j%3,v+1) for j in range(9)] for i in range(9) for v in range(9)]
    nums = [[entryToVariable(i,j,v+1) for v in range(9)] for i in range(9) for j in range(9)]
    return [c for l in rows+cols+blocks+nums for c in exactlyOne(l)]

_BASE_CNF = _build_base_cnf()

def toCnf(s):
    return _BASE_CNF + [[entryToVariable(i,j,s[i][j])] for i in range(9) for j in range(9) if s[i][j] > 0]

def solutionToSudoku(sol):
    s = [[0 for i in range(9)] for j in range(9)]
    for l in sol:
        if l > 0:
            v = (l-1) % 9 + 1
            j = ((l-1) // 9) % 9
            i = (l-1) // 81
            s[i][j] = v
    return s


def solve_sudokus():
    import sys
    for sudoku_string in sys.stdin:
        s = sudokuFromString(sudoku_string)
        cnf = toCnf(s)
        sol = pycosat.solve(cnf)
        solved = solutionToSudoku(sol)
        printSudokuInline(solved)

#----------- Extra Code for generating sudokus------------------------------------

def diff(sols):
    sols = [solutionToSudoku(sol) for sol in sols]
    pos = [[{sol[i][j] for sol in sols} for j in range(9)] for i in range(9)]
    r = [] 
    for i in range(9):
        for j in range(9):
            r.append((i,j,pos[i][j]))
    r.sort(key = lambda e: len(e[2]), reverse=True)
    return r


def take(it, n):
    return list(itertools.islice(it,n))
        

def gen_sudoku():
    s = [[0 for i in range(9)] for j in range(9)]

    hints = []
    n = 0
    while n < 10:
        i = random.randrange(9)
        j = random.randrange(9)
        if s[i][j] != 0:
            continue
        v = random.randrange(1, 10)
        s[i][j] = v
        if pycosat.solve(_BASE_CNF + hints + [[entryToVariable(i, j, v)]]) == "UNSAT":
            s[i][j] = 0
        else:
            hints.append([entryToVariable(i, j, v)])
            n = n + 1

    sols = take(pycosat.itersolve(_BASE_CNF + hints), 9)
    while len(sols) > 1:
        d = diff(sols)[0]
        i = d[0]
        j = d[1]
        v = list(d[2])[random.randrange(len(d[2]))]
        s[i][j] = v
        hints.append([entryToVariable(i, j, v)])
        sols = take(pycosat.itersolve(_BASE_CNF + hints), 9)

    return s


def has_unique_solution(s):
    sols = take(pycosat.itersolve(toCnf(s)), 2)
    return len(sols) == 1


def minimize(s):
    cells = [(i, j) for i in range(9) for j in range(9) if s[i][j] != 0]
    random.shuffle(cells)
    for i, j in cells:
        v = s[i][j]
        s[i][j] = 0
        if not has_unique_solution(s):
            s[i][j] = v
    return s


if __name__ == "__main__":
    solve_sudokus()
