#include <bits/stdc++.h>
using namespace std;
char a[510][510];
int connected = 0;
void dfs(int source, list<int> graph[], int k, int n, int m, int visited[],
         int *sum) {
  visited[source] = 1;
  int r = source / m;
  int c = source - r * m;
  list<int>::iterator it;
  (*sum) = (*sum) + 1;
  if ((*sum) >= connected - k + 1) a[r][c] = 'X';
  int pushed_row, pushed_col;
  for (it = graph[source].begin(); it != graph[source].end(); ++it) {
    if (!visited[*it]) {
      pushed_row = (*it) / m;
      pushed_col = (*it) - m * pushed_row;
      visited[*it] = 1;
      dfs(*it, graph, k, n, m, visited, sum);
    }
  }
}
int main() {
  int n, m, k;
  cin >> n >> m >> k;
  int i, j;
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) cin >> a[i][j];
  }
  list<int> graph[n * m];
  int visited[n * m];
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      visited[i * m + j] = 0;
      if (a[i][j] == '.') {
        connected++;
        if (i < n - 1 && a[i + 1][j] == '.')
          graph[i * m + j].push_back((i + 1) * m + j);
        if (j < m - 1 && a[i][j + 1] == '.')
          graph[i * m + j].push_back((i)*m + j + 1);
        if (j > 0 && a[i][j - 1] == '.')
          graph[i * m + j].push_back((i)*m + j - 1);
        if (i > 0 && a[i - 1][j] == '.')
          graph[i * m + j].push_back((i - 1) * m + j);
      }
    }
  }
  list<int>::iterator it;
  int sum = 0;
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) {
      if (a[i][j] == '.') {
        dfs(i * m + j, graph, k, n, m, visited, &sum);
        break;
      }
    }
    if (j < m) break;
  }
  for (i = 0; i < n; i++) {
    for (j = 0; j < m; j++) cout << a[i][j];
    cout << endl;
  }
}
