#include <iostream>
#include <vector>
using namespace std;
bool v_possible(vector<vector<int>>& sudoku, pair<int, int> pos, int num){
for(int i = 0; i < 9; i++){
if(i != pos.first and sudoku[i][pos.second] == num){
return false;
}
}
return true;
}
bool h_possible(vector<vector<int>>& sudoku, pair<int, int> pos, int num){
for(int i = 0; i < 9; i++){
if(i != pos.second and sudoku[pos.first][i] == num){
return false;
}
}
return true;
}
bool s_possible(vector<vector<int>>& sudoku, pair<int, int> pos, int num){
int r = pos.first / 3 * 3;
int c = pos.second / 3 * 3;
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(r + i != pos.first and c + j != pos.second and sudoku[r + i][c + j] == num){
return false;
}
}
}
return true;
}
void dfs(vector<vector<int>>& sudoku, vector<pair<int, int>>& blank, int idx){
if(idx == blank.size()){
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
cout << sudoku[i][j] << " ";
}
cout << '\n';
}
exit(0);
}
for(int i = 1; i <= 9; i++){
pair<int, int> pos = blank[idx];
if(v_possible(sudoku, pos, i) and h_possible(sudoku, pos, i) and s_possible(sudoku, pos, i)){
sudoku[pos.first][pos.second] = i;
dfs(sudoku, blank, idx + 1);
sudoku[pos.first][pos.second] = 0;
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
vector<vector<int>> sudoku(9, vector<int>(9));
vector<pair<int, int>> blank;
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
cin >> sudoku[i][j];
if(sudoku[i][j] == 0){
blank.push_back(make_pair(i, j));
}
}
}
dfs(sudoku, blank, 0);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmJvb2wgdl9wb3NzaWJsZSh2ZWN0b3I8dmVjdG9yPGludD4+JiBzdWRva3UsIHBhaXI8aW50LCBpbnQ+IHBvcywgaW50IG51bSl7Cglmb3IoaW50IGkgPSAwOyBpIDwgOTsgaSsrKXsKCQlpZihpICE9IHBvcy5maXJzdCBhbmQgc3Vkb2t1W2ldW3Bvcy5zZWNvbmRdID09IG51bSl7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CglyZXR1cm4gdHJ1ZTsKfQoKYm9vbCBoX3Bvc3NpYmxlKHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIHN1ZG9rdSwgcGFpcjxpbnQsIGludD4gcG9zLCBpbnQgbnVtKXsKCWZvcihpbnQgaSA9IDA7IGkgPCA5OyBpKyspewoJCWlmKGkgIT0gcG9zLnNlY29uZCBhbmQgc3Vkb2t1W3Bvcy5maXJzdF1baV0gPT0gbnVtKXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCXJldHVybiB0cnVlOwp9Cgpib29sIHNfcG9zc2libGUodmVjdG9yPHZlY3RvcjxpbnQ+PiYgc3Vkb2t1LCBwYWlyPGludCwgaW50PiBwb3MsIGludCBudW0pewoJCglpbnQgciA9IHBvcy5maXJzdCAvIDMgKiAzOwoJaW50IGMgPSBwb3Muc2Vjb25kIC8gMyAqIDM7CgkKCWZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspewoJCWZvcihpbnQgaiA9IDA7IGogPCAzOyBqKyspewoJCQlpZihyICsgaSAhPSBwb3MuZmlyc3QgYW5kIGMgKyBqICE9IHBvcy5zZWNvbmQgYW5kIHN1ZG9rdVtyICsgaV1bYyArIGpdID09IG51bSl7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9Cgl9CglyZXR1cm4gdHJ1ZTsKfQoKdm9pZCBkZnModmVjdG9yPHZlY3RvcjxpbnQ+PiYgc3Vkb2t1LCB2ZWN0b3I8cGFpcjxpbnQsIGludD4+JiBibGFuaywgaW50IGlkeCl7CglpZihpZHggPT0gYmxhbmsuc2l6ZSgpKXsKCQlmb3IoaW50IGkgPSAwOyBpIDwgOTsgaSsrKXsKCQkJZm9yKGludCBqID0gMDsgaiA8IDk7IGorKyl7CgkJCQljb3V0IDw8IHN1ZG9rdVtpXVtqXSA8PCAiICI7CgkJCX0KCQkJY291dCA8PCAnXG4nOwoJCX0KCQlleGl0KDApOwoJfQoJCglmb3IoaW50IGkgPSAxOyBpIDw9IDk7IGkrKyl7CgkJcGFpcjxpbnQsIGludD4gcG9zID0gYmxhbmtbaWR4XTsKCQlpZih2X3Bvc3NpYmxlKHN1ZG9rdSwgcG9zLCBpKSBhbmQgaF9wb3NzaWJsZShzdWRva3UsIHBvcywgaSkgYW5kIHNfcG9zc2libGUoc3Vkb2t1LCBwb3MsIGkpKXsKCQkJc3Vkb2t1W3Bvcy5maXJzdF1bcG9zLnNlY29uZF0gPSBpOwoJCQlkZnMoc3Vkb2t1LCBibGFuaywgaWR4ICsgMSk7CgkJCXN1ZG9rdVtwb3MuZmlyc3RdW3Bvcy5zZWNvbmRdID0gMDsKCQl9Cgl9Cn0KCmludCBtYWluKCkgewoJCglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwoJY2luLnRpZSgwKTsKCQoJdmVjdG9yPHZlY3RvcjxpbnQ+PiBzdWRva3UoOSwgdmVjdG9yPGludD4oOSkpOwoJdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiBibGFuazsKCQoJZm9yKGludCBpID0gMDsgaSA8IDk7IGkrKyl7CgkJZm9yKGludCBqID0gMDsgaiA8IDk7IGorKyl7CgkJCWNpbiA+PiBzdWRva3VbaV1bal07CgkJCWlmKHN1ZG9rdVtpXVtqXSA9PSAwKXsKCQkJCWJsYW5rLnB1c2hfYmFjayhtYWtlX3BhaXIoaSwgaikpOwoJCQl9CgkJfQoJfQoJCglkZnMoc3Vkb2t1LCBibGFuaywgMCk7CgkKCXJldHVybiAwOwp9