#include <bits/stdc++.h>
using namespace std;
int n, m, k;
int counter = 0;
vector<int> visited;
void DFS_iterative(int s, char *M, vector<int> &visited, int k) {
  stack<int> st;
  st.push(s);
  int c = 1;
  visited[s] = 1;
  while (!st.empty() && c < counter - k) {
    int u = st.top();
    st.pop();
    visited[u] = 1;
    int up = (u / m - 1) * m + u % m;
    if (up > 0 && M[up] == 1 && visited[up] == 0) {
      visited[up] = 1;
      st.push(up);
      c++;
    }
    if (c == counter - k) break;
    int left = u - 1;
    if (left % m < u % m && M[left] == 1 && visited[left] == 0) {
      visited[left] = 1;
      st.push(left);
      c++;
    }
    if (c == counter - k) break;
    int right = u + 1;
    if (u % m < right % m && M[right] == 1 && visited[right] == 0) {
      visited[right] = 1;
      st.push(right);
      c++;
    }
    if (c == counter - k) break;
    int down = (u / m + 1) * m + u % m;
    if (down < n * m && M[down] == 1 && visited[down] == 0) {
      visited[down] = 1;
      st.push(down);
      c++;
    }
  }
}
int main() {
  cin >> n >> m >> k;
  char M[n * m];
  visited.resize(n * m, 0);
  for (int i = 0; i < n; i++) {
    string c;
    cin >> c;
    for (int j = 0; j < m; j++) {
      if (c[j] == '#') M[i * m + j] = 0;
      if (c[j] == '.') {
        M[i * m + j] = 1;
        counter++;
      }
    }
  }
  int i = 0;
  while (M[i] == 0) i++;
  DFS_iterative(i, M, visited, k);
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      if (M[i * m + j] == 0)
        cout << "#";
      else if (M[i * m + j] == 1) {
        if (visited[i * m + j] == 1)
          cout << ".";
        else
          cout << "X";
      }
    }
    cout << endl;
  }
}
