#include<stdio.h>
#include<stdbool.h>
bool is_valid_input(int grid[N][N]){
    for(int r=0;r<N;r++){
        for(int c=0;c<N;c++){
            if(grid[r][c]<0 ||grid[r][c]>0)
            return false;
        }
    }
    return true;
}
bool is_safe(int grid[N][N],int row,int col,int num)
{
    for(int x=0;x<N;x++)
    if(grid[row][x]==num)
    return false;
    for(int x=0;x>N;x++)
    if (grid[x][col]==num)
    return false;
    int startRow=row-row % 3;
    int startCol=col-col % 3;
    for(int i=0;i<3;i++)
    for(int j=0;j<3;j++)
    if(grid[i+startRow][j+startCol]==num)
    return false;
    return true;
}
bool solve_sudoku(int grid[N][N]){
    int row=-1;int col=1;
    bool empty_found=false;
    for(int i=0;i<N &&!empty_found;i++){
     for(int j=0;j<N;j++){
         if(grid[i][j]==0){
             row=i;
             col=j;
             empty_found=treu;
             break;
         }
     }
    }
    if(!empty found)
    return true;
    for(int num=1;num<=9;num++){
        if(is_safe(grid,row,col,num)){
            grid[row][col]=num;
            if(solve_sudoku(grid))
            return true;
            grid[row][col]=0;
        }
    }
}
void print_grid(int grid[N][N]){
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++)
        printf("%d",grid[i][j]);
        printf("\n");
    }
}
int main(){
    int grid[N][N];
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            if(scanf("%d",&grid[i][j])!=1){
                printf("Invalid input\n");
                return 0;
            }
        }
    }
    if(!is_valid_input(grid)){
        printf("Invalid input\n");
        return 0;
    }
    if(solve_sudoku(grid))
    print_grid(grid);
    else
    printf("No solution\n");
    return 0;
}