#include <bits/stdc++.h>
using namespace std;
int n, m, k, snum;
vector<vector<char> > temp;
int x[] = {-1, 0, 1, 0};
int y[] = {0, 1, 0, -1};
void dfs(int i, int j) {
  int count = 0;
  queue<pair<int, int> > s;
  pair<int, int> tempPair;
  tempPair.first = i;
  tempPair.second = j;
  s.push(tempPair);
  int makeBlack = ((snum - k) == 0) ? 0 : 1;
  vector<vector<int> > isVisited;
  isVisited.resize(n);
  for (int i = 0; i < n; i++) isVisited[i].resize(m);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) isVisited[i][j] = 0;
  while (s.size() > 0) {
    int flag = 0;
    tempPair = s.front();
    s.pop();
    if (isVisited[tempPair.first][tempPair.second]) continue;
    count++;
    isVisited[tempPair.first][tempPair.second] = 1;
    if (count > snum - k) temp[tempPair.first][tempPair.second] = 'X';
    for (int j = 0; j < 4; j++) {
      int nextRow, nextCol;
      nextRow = tempPair.first + y[j];
      nextCol = tempPair.second + x[j];
      if (((nextRow) >= 0) && ((nextRow) < n) && ((nextCol) >= 0) &&
          ((nextCol) < m)) {
        if (isVisited[nextRow][nextCol])
          continue;
        else if (temp[nextRow][nextCol] == '.') {
          s.push(pair<int, int>(nextRow, nextCol));
          flag = 1;
        }
      }
    }
  }
}
int main() {
  cin >> n >> m >> k;
  snum = 0;
  temp.resize(n);
  for (int i = 0; i < n; i++) temp[i].resize(m);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      cin >> temp[i][j];
      if (temp[i][j] == '.') {
        snum++;
      }
    }
  int flag = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (temp[i][j] == '.') {
        dfs(i, j);
        flag = 1;
        break;
      }
    }
    if (flag == 1) break;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cout << temp[i][j];
    }
    cout << "\n";
  }
  return 0;
}
