package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)


func check(matrix [][]int, row, col, value int) bool {
    /*
            检测在(row,col)放value是否合适
            1.每行含1-9,不含重复值value
            2.每列含1-9,不含重复值value
            3.3*3区块含1-9,不含重复值value
    */
    for j := 0; j < 9; j ++ {
        // 检测每行
        if matrix[row][j] == value {
            return false
        }
        // 检测每列
        if matrix[j][col] == value {
            return false
        }
    }
    // 检测元素所在3*3区域
    area_row := (row / 3) * 3
    area_col := (col / 3) * 3
    for i := area_row; i < area_row +3; i ++ {
        for j := area_col; j < area_col +3; j ++ {
            if matrix[i][j] == value {
                return false
            }
        }

    }
    return true
}


func solveSudoku(matrix [][]int, count int) bool {
    if count == 81 {
        return true
    }
    row := count / 9 // 行标
    col := count % 9 // 列表

    if matrix[row][col] != 0 { // 已填充
        return solveSudoku(matrix, count+1)
    }
    for i := 1; i < 10; i++ {
        if check(matrix, row, col, i) { // 找到可填充的数
            matrix[row][col] = i
            if solveSudoku(matrix, count+1) {
                return true
            }
            matrix[row][col] = 0
        }

    }
    return false
}


func main() {
    r := bufio.NewScanner(os.Stdin)
    matrix := make([][]int, 0)
    for  {
        r.Scan()
        str := r.Text()
        if str == "" {
            break
        }
        n := make([]int, 0, 9)
        for _, v := range strings.Split(str, " ") {
            s, _ := strconv.Atoi(v)
            n = append(n, s)
        }
        matrix = append(matrix, n)
    }
    solveSudoku(matrix, 0)
    for _, v := range matrix {
        res := ""
        for _, j := range v {
            res += fmt.Sprintf("%d ", j)

        }
        fmt.Println(res)

    }
}