#include <bits/stdc++.h>
using namespace std;
int main() {
  int n, m, k;
  cin >> n >> m >> k;
  vector<string> v(n);
  vector<vector<int>> ans(n, vector<int>(m, 0));
  vector<vector<bool>> visited(n, vector<bool>(m, false));
  for (auto &i : v) cin >> i;
  int blocked = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (v[i][j] == '#') {
        blocked++;
        visited[i][j] = true;
      }
  int reqd_connected = n * m - blocked - k;
  int curr = 0, flag = 0;
  ;
  int horizontal_movement[3] = {0, 1, -1};
  int vertical_movement[3] = {0, 1, -1};
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (v[i][j] == '.') {
        curr++;
        visited[i][j] = true;
        if (curr == reqd_connected) {
          flag = 1;
          break;
        }
        ans[i][j] = 1;
        queue<pair<int, int>> q;
        q.push({i, j});
        while (!q.empty()) {
          pair<int, int> front = q.front();
          q.pop();
          for (int v = 0; v < 3; v++) {
            for (int h = 0; h < 3; h++) {
              if (abs(horizontal_movement[h]) + abs(vertical_movement[v]) == 2)
                continue;
              int x = front.first + vertical_movement[v];
              int y = front.second + horizontal_movement[h];
              if (x >= 0 && x < n && y >= 0 && y < m &&
                  visited[x][y] == false) {
                q.push({x, y});
                visited[x][y] = true;
                ans[x][y] = 1;
                curr++;
                if (curr == reqd_connected) {
                  flag = 1;
                  break;
                }
              }
              if (flag) break;
            }
            if (flag) break;
          }
          if (flag) break;
        }
        if (flag) break;
      }
      if (flag) break;
    }
    if (flag) break;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (v[i][j] == '.' && visited[i][j] == false) v[i][j] = 'X';
    }
  }
  for (auto i : v) cout << i << "\n";
  return 0;
}
