#include <bits/stdc++.h>
using namespace std;
int limit = 0;
int mb = 0;
void bfs(int source, int visited[], vector<int> A[]) {
  if (limit == 0) {
    return;
  }
  for (int i = 0; i < A[source].size(); i++) {
    if (visited[A[source][i]] == 0) {
      visited[A[source][i]] = 1;
      limit--;
      if (limit == 0) return;
      bfs(A[source][i], visited, A);
      if (limit == 0) return;
    }
  }
  return;
}
int main() {
  int n, m, k;
  cin >> n >> m >> k;
  mb = m;
  string x[n];
  for (int i = 0; i < n; i++) cin >> x[i];
  vector<int> A[n * m];
  int one = 0, count = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (x[i][j] != '#') {
        one = i * m + j;
        count++;
        if (i < n - 1 && x[i + 1][j] == '.') {
          A[i * m + j].push_back(i * m + m + j);
        }
        if (i > 0 && x[i - 1][j] == '.') {
          A[i * m + j].push_back(i * m - m + j);
        }
        if (j < m - 1 && x[i][j + 1] == '.') {
          A[i * m + j].push_back(i * m + 1 + j);
        }
        if (m > 0 && x[i][j - 1] == '.') {
          A[i * m + j].push_back(i * m - 1 + j);
        }
      }
    }
  }
  int visited[n * m];
  fill(visited, visited + n * m - 1, 0);
  visited[one] = 1;
  limit = count - k - 1;
  bfs(one, visited, A);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (x[i][j] == '#')
        cout << "#";
      else
        cout << ((visited[i * m + j] == 1) ? "." : "X");
    }
    cout << endl;
  }
}
