#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:200000000")
using namespace std;
const int MAXN = 500;
const int MOD = (int)1e9 + 7;
const int INF = 0x3f3f3f3f;
const long long INF_64 = (1LL << 62);
const double eps = 1e-9;
int n, m, k;
vector<vector<int> > g;
vector<bool> u;
vector<int> order;
string a[MAXN];
int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
bool correct(int x, int y) { return x >= 0 && x < n && y >= 0 && y < m; }
void dfs(int v) {
  u[v] = true;
  order.push_back(v);
  for (int i = 0; i < (int)g[v].size(); i++) {
    int to = g[v][i];
    if (!u[to]) dfs(to);
  }
}
void write() {
  for (int i = (int)order.size() - 1; i > (int)order.size() - k - 1; i--)
    a[order[i] / m][order[i] % m] = 'X';
  for (int i = 0; i < n; i++) cout << a[i] << endl;
  exit(0);
}
int main() {
  cin >> n >> m >> k;
  g.resize(n * m);
  u.resize(n * m);
  for (int i = 0; i < n; i++) cin >> a[i];
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      if (a[i][j] == '#') continue;
      for (int k = 0; k < 4; k++) {
        int x = i + dx[k], y = j + dy[k];
        if (!correct(x, y) || a[x][y] == '#') continue;
        g[m * i + j].push_back(m * x + y);
      }
    }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      if (a[i][j] == '.') {
        dfs(i * m + j);
        write();
      }
}
