#include <bits/stdc++.h>

using namespace std;

const int N = 81, P = 9;

int block[][ P ] = {
    { 0, 0, 0, 1, 1, 1, 2, 2, 2 },
    { 0, 0, 0, 1, 1, 1, 2, 2, 2 },
    { 0, 0, 0, 1, 1, 1, 2, 2, 2 },
    { 3, 3, 3, 4, 4, 4, 5, 5, 5 },
    { 3, 3, 3, 4, 4, 4, 5, 5, 5 },
    { 3, 3, 3, 4, 4, 4, 5, 5, 5 },
    { 6, 6, 6, 7, 7, 7, 8, 8, 8 },
    { 6, 6, 6, 7, 7, 7, 8, 8, 8 },
    { 6, 6, 6, 7, 7, 7, 8, 8, 8 } };

class sudoku_t: vector< int >
{
    int cell[ P ][ P ];

    typedef bitset< P >       bitset_t;

    array< bitset_t, P > row, col, blk;

    bool set_cell( int i, int j, int k )
    {
        int b = block[ i ][ j ], l = k - 1;

        if ( row[ i ][ l ] or col[ j ][ l ] or blk[ b ][ l ] )
            return false;
        else
        {
            push_back( cell[ i ][ j ] ), cell[ i ][ j ] = k;

            return row[ i ][ l ] = col[ j ][ l ] = blk[ b ][ l ] = true;
        }
    }

    void reset_cell( int i, int j )
    {
        int b = block[ i ][ j ], k = cell[ i ][ j ], l = k - 1;

        cell[ i ][ j ] = back(), pop_back(), row[ i ][ l ] = col[ j ][ l ] = blk[ b ][ l ] = false;
    }

public:

    sudoku_t()
    {
        for( int i = 0; i < P; i++ )
            for( int j = 0; j < P; j++ )
            {
                int k; cin >> k, cell[ i ][ j ] = 0;

                if ( k > 0 and not set_cell( i, j, k ) )
                {
                    cout << "invalid initial state cell(",
                    cout << i << ',' << j << ") = " << k << endl;
                    exit( 1 );
                }
            }
    }

    bool solved( const int row = 0, const int col = 0 )
    {
        int next_col = col, next_row = row;

        if ( ++next_col == P )
            next_col = 0, ++next_row;

        if ( cell[ row ][ col ] != 0 )
            return size() == N ? true : solved( next_row, next_col );

        for( int k = 1; k <= P; k++ )
            if ( set_cell( row, col, k ) )
            {
                if ( size() == N or solved( next_row, next_col ) )
                    return true;
                else
                    reset_cell( row, col );
            }

        return false;
    }

    void write() const
    {
        for( int i = 0; i < P; i++, cout << '\n' )
            for( int j = 0; j < P; j++ )
                cout << cell[ i ][ j ] << ' ';
    }
};

int main()
{
    ios_base::sync_with_stdio( false ), cin.tie( nullptr ), cout.tie( nullptr );

    sudoku_t sudoku;

    if ( sudoku.solved() )
        sudoku.write();
    else
        cout << "No solution";
}
