#include <bits/stdc++.h>   using namespace std;   template <typename T, typename V>   ostream &operator<<(ostream &out, const pair<T, V> x) {     out <<  {  << x.first <<   :   << x.second <<  } ;     return out;   }   template <typename T>   ostream &operator<<(ostream &out, const set<T> x) {     for (auto &it : x) {       out << it <<    ;     }     return out;   }   template <typename T>   ostream &operator<<(ostream &out, const multiset<T> x) {     for (auto &it : x) {       out << it <<    ;     }     return out;   }   template <typename T, typename V>   ostream &operator<<(ostream &out, const map<T, V> x) {     for (auto &it : x) {       out <<  [  << it.first <<  ]            <<   =   << it.second <<   n ;     }     return out;   }   template <typename T>   ostream &operator<<(ostream &out, const vector<T> x) {     for (int i = 0; i < x.size() - 1; ++i) {       out << x[i] <<    ;     }     out << x.back();     return out;   }   template <typename T>   ostream &operator<<(ostream &out, const vector<vector<T> > x) {     for (int i = 0; i < x.size() - 1; ++i) {       out <<  [  << i <<  ]            <<   = {  << x[i] <<  } n ;     }     out <<  [  << x.size() - 1 <<  ]          <<   = {  << x.back() <<  } n ;     return out;   }   const int N = 1e6 + 5;   const int MOD = 1e9 + 7;   const int INF = 1e9;   vector<vector<char> > a, ans;   vector<vector<int> > cnt, dst;   int n, m;   long long get(long long x1, long long y1, long long x2, long long y2) {     --x1, --y1;     if (x1 < 0 || y1 < 0) return 0;     return cnt[x2][y2] - cnt[x1][y2] - cnt[x2][y1] + cnt[x1][y1];   }   queue<pair<long long, long long> > qu;   void bfs(long long x) {     while (!qu.empty()) {       pair<long long, long long> cr = qu.front();       qu.pop();       for (int i = -1; i <= 1; ++i) {         for (int j = -1; j <= 1; ++j) {           if (dst[cr.first + i][cr.second + j] == 0) {             if (cr.first + i <= 0 || cr.first + i > n || cr.second + j <= 0 ||                 cr.second + j > m)               continue;             dst[cr.first + i][cr.second + j] = dst[cr.first][cr.second] + 1;             qu.push({cr.first + i, cr.second + j});           }         }       }     }   }   bool solve(long long x) {     while (!qu.empty()) qu.pop();     long long sz = 2 * x + 1;     for (int i = 1; i <= n; ++i) {       for (int j = 1; j <= m; ++j) {         ans[i][j] =  . ;         dst[i][j] = 0;         long long c = get(i - sz + 1, j - sz + 1, i, j);         if (c == sz * sz) ans[i - x][j - x] =  X ;         if (i >= x && j >= x && ans[i - x][j - x] ==  X ) {           qu.push({i - x, j - x});           dst[i - x][j - x] = 1;         }       }     }     if (qu.empty()) return false;     bfs(x);     for (int i = 1; i <= n; ++i) {       for (int j = 1; j <= m; ++j) {         if (a[i][j] ==  X  && dst[i][j] > x + 1) return false;       }     }     return true;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     cin >> n >> m;     a.resize(n + 2, vector<char>(m + 2));     ans.resize(n + 2, vector<char>(m + 2));     cnt.resize(n + 2, vector<int>(m + 2));     dst.resize(n + 2, vector<int>(m + 2));     for (int i = 1; i <= n; ++i) {       for (int j = 1; j <= m; ++j) {         cin >> a[i][j];         cnt[i][j] =             cnt[i][j - 1] + cnt[i - 1][j] - cnt[i - 1][j - 1] + (a[i][j] ==  X );       }     }     int l = 0, r = INF;     while (r - l > 1) {       int mid = (l + r) >> 1;       if (solve(mid)) {         l = mid;       } else {         r = mid;       }     }     if (solve(r))       cout << r;     else if (solve(l))       cout << l;     cout <<   n ;     for (int i = 1; i <= n; ++i) {       for (int j = 1; j <= m; ++j) {         cout << ans[i][j];       }       cout <<   n ;     }     return 0;   }