# include<iostream>
# include<vector>
using namespace std;

vector<vector<int>> sudoku(9, vector<int>(9, 0));
vector<vector<int>> result(9, vector<int>(9, 0));

bool isvalid(vector<vector<int>> &sudoku, int row, int col, int num){
    for(int i = 0; i < 9; i++){
        if(sudoku[i][col] == num){ // 看列合不合法
            return false;
        }
        if(sudoku[row][i] == num){ // 看行合不合法
            return false;
        }
        if(sudoku[(row/3)*3 + i/3][(col/3)*3 + i%3] == num){ // 看3 * 3中小正方形合不合法
            return false;
        }
    }
    return true;
}

void backtrack(vector<vector<int>> &sudoku, int i, int j){
    int m = 9, n = 9;
    if(j == n){
        // 一行一行遍历,遍历到最后一列就换到下一行重新开始。
        backtrack(sudoku, i + 1, 0);
        return;
    }
    // 如果i走到最后一行,表示找到一个结果,找到一个就保存起来
    //(可能有多个,会覆盖,只留下一个即可)
    if(i == m){
        for(int i=0;i<9;i++){
            for(int j=0; j<9; j++){
                result[i][j] = sudoku[i][j];
            }
        }
        return;
    }
    // sudoku[i][j] == 0表示这个数需要填入1-9, 否则就下一个
    if(sudoku[i][j] != 0){
        backtrack(sudoku, i, j + 1);
        return;
    }
    // 这里sudoku[i][j] == 0, 从1-9中选择数字填入
    for(int num = 1; num <= 9; num++){
        if(!isvalid(sudoku, i, j, num)){ // 不合法就跳过
            continue;
        }
        sudoku[i][j] = num; // 合法就先标记
        backtrack(sudoku, i, j + 1); // 接着回溯下一个
        sudoku[i][j] = 0; // 恢复现场
    }
}

int main(){
    sudoku.clear();
    for(int i=0; i<9; i++){
        for(int j=0; j<9; j++){
            cin >> sudoku[i][j];
        }
    }
    backtrack(sudoku, 0, 0);
    for(int i=0;i<9;i++){
        for(int j=0; j<8; j++){
            cout << result[i][j] << " ";
        }
        cout << result[i][8] << endl;
    }
    return 0;
}