def check(sudoku, i, j):  # 判断这个数填入数独的i,j位置是否合理
    for k in range(9):
        if (sudoku[i][k] == sudoku[i][j]) and (k != j):  # 若是这一列有重复的数据,认为这个数非法
            return False
    for k in range(9):
        if (sudoku[k][j] == sudoku[i][j]) and (k != i):  # 若是这一行有重复的数据,认为这个数非法
            return False
    m = 3 * (i // 3)  # m,n分别是i,j位置所在的3*3格子的最左上角的位置
    n = 3 * (j // 3)
    for k in range(3):
        for z in range(3):
            if (
                (sudoku[m + k][n + z] == sudoku[i][j])
                and ((m + k) != i)
                and ((n + z) != j)
            ):  # 判断所在3*3格子是否有重复的数据
                return False
    return True  # 若都没有,那么认为这个数在重复上面没有问题


def find_sudoku(sudoku):
    for i in range(9):
        for j in range(9):
            if sudoku[i][j] == 0:  # 若是找到为0的
                for t in range(1, 10):  # 在这个位置依次填入1-9尝试
                    sudoku[i][j] = t
                    if (check(sudoku, i, j)) and (
                        find_sudoku(sudoku)
                    ):  # 若是满足数独要求,而且填完这个数之后的0也能被成功填写
                        return True  # 认为成功
                    sudoku[i][j] = 0  # 如果1-9都不行认为是之前填的数不合适,恢复这次填的数
                return False  # 返回之前一个false
    return True  # 走到这一步认为所有的空都被填满,返回成功


while True:
    try:
        sudoku = []
        sudoku_index = []
        for i in range(9):
            a = list(map(int, input().split()))
            sudoku.append(a)  # 将数独输入
        find_sudoku(sudoku)
        for i in range(9):
            print(*sudoku[i])
    except:
        break