#include <bits/stdc++.h>
using namespace std;
int Set(int N, int p) { return N |= (1 << p); }
int Reset(int N, int p) { return N &= ~(1 << p); }
bool Check(int N, int p) { return N & (1 << p); }
template <class T>
inline void input(T &x) {
  register char c = getchar();
  x = 0;
  int neg = 0;
  for (; ((c < 48 || c > 57) && c != '-'); c = getchar())
    ;
  if (c == '-') {
    neg = 1;
    c = getchar();
  }
  for (; c > 47 && c < 58; c = getchar()) {
    x = (x << 1) + (x << 3) + c - 48;
  }
  if (neg) x = -x;
}
const int dr[] = {0, -1, 0, 1, -1, -1, 1, 1};
const int dc[] = {1, 0, -1, 0, 1, -1, -1, 1};
const int M = 100000 + 5;
char grid[15][15];
pair<int, int> get(int row) {
  row %= 3;
  if (row == 1) return make_pair(1, 3);
  if (row == 2) return make_pair(4, 6);
  if (row == 0) return make_pair(7, 9);
}
int main() {
  for (int i = 1; i <= 11; i++) {
    if (i == 4 or i == 8) {
      getchar();
      continue;
    }
    for (int j = 1; j <= 11; j++) {
      if (j == 4 or j == 8) {
        getchar();
        continue;
      }
      int r = i, c = j;
      if (r > 8) r--;
      if (r > 4) r--;
      if (c > 8) c--;
      if (c > 4) c--;
      grid[r][c] = getchar();
    }
    getchar();
  }
  int row, col;
  cin >> row >> col;
  pair<int, int> rowrange, colrange;
  rowrange = get(row);
  colrange = get(col);
  bool mark = false;
  for (int i = rowrange.first; i <= rowrange.second; i++) {
    for (int j = colrange.first; j <= colrange.second; j++) {
      if (grid[i][j] == '.') {
        grid[i][j] = '!';
        mark = true;
      }
    }
  }
  if (!mark) {
    for (int i = 1; i <= 9; i++) {
      for (int j = 1; j <= 9; j++) {
        if (grid[i][j] == '.') grid[i][j] = '!';
      }
    }
  }
  for (int i = 1; i <= 9; i++) {
    if (i == 4 or i == 7) cout << endl;
    for (int j = 1; j <= 9; j++) {
      if (j == 4 or j == 7) cout << ' ';
      cout << grid[i][j];
    }
    cout << endl;
  }
  return 0;
}
