#include <bits/stdc++.h>
using namespace std;
template <class C>
void mini(C& a4, C b4) {
  a4 = min(a4, b4);
}
template <class C>
void maxi(C& a4, C b4) {
  a4 = max(a4, b4);
}
template <class T1, class T2>
ostream& operator<<(ostream& out, pair<T1, T2> pair) {
  return out << "(" << pair.first << ", " << pair.second << ")";
}
const int MX = 510;
string maze[MX];
int dst[MX][MX];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
int main() {
  ios_base::sync_with_stdio(false);
  cout << fixed << setprecision(10);
  int n, m;
  cin >> n >> m;
  int k;
  cin >> k;
  for (int i = 0; i < (n); ++i) cin >> maze[i];
  vector<pair<int, int> > order;
  pair<int, int> start;
  for (int i = 0; i < (n); ++i)
    for (int j = 0; j < (m); ++j) {
      if (maze[i][j] == '.') start = make_pair(i, j);
    }
  dst[start.first][start.second] = 1;
  queue<pair<int, int> > Q;
  Q.push(start);
  order.push_back(start);
  while (!Q.empty()) {
    pair<int, int> f = Q.front();
    Q.pop();
    int x = f.first;
    int y = f.second;
    for (int t = 0; t < (4); ++t) {
      int xx = x + dx[t];
      int yy = y + dy[t];
      if (xx >= 0 && xx < n && yy >= 0 && yy < m && maze[xx][yy] == '.' &&
          dst[xx][yy] == 0) {
        dst[xx][yy] = 1;
        Q.push(make_pair(xx, yy));
        order.push_back(make_pair(xx, yy));
      }
    }
  }
  reverse((order).begin(), (order).end());
  for (int i = 0; i < (k); ++i) {
    maze[order[i].first][order[i].second] = 'X';
  }
  for (int i = 0; i < (n); ++i) cout << maze[i] << endl;
  return 0;
}
