#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pll pair<ll, ll>
#define mp make_pair
#define fi first
#define se second
ll N, M;
const ll NI[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
const ll NJ[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
int main() {
cin >> N >> M;
vector<vector<char>> a(N, vector<char>(M, 0));
vector<vector<ll>> dist(N, vector<ll>(M, -1));
queue<pll> bfs;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> a[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (a[i][j] == '.') continue;
for (int k = 0; k < 8; k++) {
int ni = i + NI[k];
int nj = j + NJ[k];
if (ni < 0 || ni >= N || nj < 0 || nj >= M || a[ni][nj] == '.') {
bfs.push(mp(i, j));
dist[i][j] = 0;
break;
}
}
}
}
ll maxd = 0;
while (!bfs.empty()) {
pll cur = bfs.front();
bfs.pop();
for (int k = 0; k < 8; k++) {
int ni = cur.fi + NI[k];
int nj = cur.se + NJ[k];
if (ni < 0 || ni >= N || nj < 0 || nj >= M || a[ni][nj] == '.' || dist[ni][nj] != -1) continue;
dist[ni][nj] = dist[cur.fi][cur.se] + 1;
maxd = max(maxd, dist[ni][nj]);
bfs.push(mp(ni, nj));
}
}
ll l = 0;
ll r = maxd;
ll T, mid;
while (l <= r) {
mid = (l + r)/2;
vector<vector<ll>> dist2(N, vector<ll>(M, -1));
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (dist[i][j] >= mid) {
bfs.push(mp(i, j));
dist2[i][j] = 0;
}
}
}
while (!bfs.empty()) {
pll cur = bfs.front();
bfs.pop();
for (int k = 0; k < 8; k++) {
int ni = cur.fi + NI[k];
int nj = cur.se + NJ[k];
if (ni < 0 || ni >= N || nj < 0 || nj >= M || a[ni][nj] == '.' || dist2[ni][nj] != -1) continue;
dist2[ni][nj] = dist2[cur.fi][cur.se] + 1;
// maxd = max(maxd, dist2[ni][nj]);
if (dist2[ni][nj] < mid) bfs.push(mp(ni, nj));
}
}
bool valid = true;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if ((a[i][j] == 'X') != (dist2[i][j] != -1)) valid = false;
}
}
if (valid) {
T = mid;
l = mid+1;
} else r = mid-1;
}
cout << T << endl;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (j != 0) cout << " ";
cout << (dist[i][j] >= T ? 'X' : '.');
}
cout << endl;
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgcGxsIHBhaXI8bGwsIGxsPgojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCmxsIE4sIE07CmNvbnN0IGxsIE5JW10gPSB7IC0xLCAtMSwgLTEsICAwLCAwLCAgMSwgMSwgMSB9Owpjb25zdCBsbCBOSltdID0geyAtMSwgIDAsICAxLCAtMSwgMSwgLTEsIDAsIDEgfTsKaW50IG1haW4oKSB7CiAgICBjaW4gPj4gTiA+PiBNOwogICAgdmVjdG9yPHZlY3RvcjxjaGFyPj4gYShOLCB2ZWN0b3I8Y2hhcj4oTSwgMCkpOwogICAgdmVjdG9yPHZlY3RvcjxsbD4+IGRpc3QoTiwgdmVjdG9yPGxsPihNLCAtMSkpOwogICAgcXVldWU8cGxsPiBiZnM7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTTsgaisrKSB7CiAgICAgICAgICAgIGNpbiA+PiBhW2ldW2pdOwogICAgICAgIH0KICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBNOyBqKyspIHsKICAgICAgICAgICAgaWYgKGFbaV1bal0gPT0gJy4nKSBjb250aW51ZTsKICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA4OyBrKyspIHsKICAgICAgICAgICAgICAgIGludCBuaSA9IGkgKyBOSVtrXTsKICAgICAgICAgICAgICAgIGludCBuaiA9IGogKyBOSltrXTsKICAgICAgICAgICAgICAgIGlmIChuaSA8IDAgfHwgbmkgPj0gTiB8fCBuaiA8IDAgfHwgbmogPj0gTSB8fCBhW25pXVtual0gPT0gJy4nKSB7CiAgICAgICAgICAgICAgICAgICAgYmZzLnB1c2gobXAoaSwgaikpOwogICAgICAgICAgICAgICAgICAgIGRpc3RbaV1bal0gPSAwOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgbGwgbWF4ZCA9IDA7CiAgICB3aGlsZSAoIWJmcy5lbXB0eSgpKSB7CiAgICAgICAgcGxsIGN1ciA9IGJmcy5mcm9udCgpOwogICAgICAgIGJmcy5wb3AoKTsKICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgewogICAgICAgICAgICBpbnQgbmkgPSBjdXIuZmkgKyBOSVtrXTsKICAgICAgICAgICAgaW50IG5qID0gY3VyLnNlICsgTkpba107CiAgICAgICAgICAgIGlmIChuaSA8IDAgfHwgbmkgPj0gTiB8fCBuaiA8IDAgfHwgbmogPj0gTSB8fCBhW25pXVtual0gPT0gJy4nIHx8IGRpc3RbbmldW25qXSAhPSAtMSkgY29udGludWU7CiAgICAgICAgICAgIGRpc3RbbmldW25qXSA9IGRpc3RbY3VyLmZpXVtjdXIuc2VdICsgMTsKICAgICAgICAgICAgbWF4ZCA9IG1heChtYXhkLCBkaXN0W25pXVtual0pOwogICAgICAgICAgICBiZnMucHVzaChtcChuaSwgbmopKTsKICAgICAgICB9CiAgICB9CgogICAgbGwgbCA9IDA7CiAgICBsbCByID0gbWF4ZDsKICAgIGxsIFQsIG1pZDsKICAgIHdoaWxlIChsIDw9IHIpIHsKICAgICAgICBtaWQgPSAobCArIHIpLzI7CiAgICAgICAgdmVjdG9yPHZlY3RvcjxsbD4+IGRpc3QyKE4sIHZlY3RvcjxsbD4oTSwgLTEpKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE07IGorKykgewogICAgICAgICAgICAgICAgaWYgKGRpc3RbaV1bal0gPj0gbWlkKSB7CiAgICAgICAgICAgICAgICAgICAgYmZzLnB1c2gobXAoaSwgaikpOwogICAgICAgICAgICAgICAgICAgIGRpc3QyW2ldW2pdID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3aGlsZSAoIWJmcy5lbXB0eSgpKSB7CiAgICAgICAgICAgIHBsbCBjdXIgPSBiZnMuZnJvbnQoKTsKICAgICAgICAgICAgYmZzLnBvcCgpOwogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykgewogICAgICAgICAgICAgICAgaW50IG5pID0gY3VyLmZpICsgTklba107CiAgICAgICAgICAgICAgICBpbnQgbmogPSBjdXIuc2UgKyBOSltrXTsKICAgICAgICAgICAgICAgIGlmIChuaSA8IDAgfHwgbmkgPj0gTiB8fCBuaiA8IDAgfHwgbmogPj0gTSB8fCBhW25pXVtual0gPT0gJy4nIHx8IGRpc3QyW25pXVtual0gIT0gLTEpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgZGlzdDJbbmldW25qXSA9IGRpc3QyW2N1ci5maV1bY3VyLnNlXSArIDE7CiAgICAgICAgICAgICAgICAvLyBtYXhkID0gbWF4KG1heGQsIGRpc3QyW25pXVtual0pOwogICAgICAgICAgICAgICAgaWYgKGRpc3QyW25pXVtual0gPCBtaWQpIGJmcy5wdXNoKG1wKG5pLCBuaikpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBib29sIHZhbGlkID0gdHJ1ZTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE07IGorKykgewogICAgICAgICAgICAgICAgaWYgKChhW2ldW2pdID09ICdYJykgIT0gKGRpc3QyW2ldW2pdICE9IC0xKSkgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgIFQgPSBtaWQ7CiAgICAgICAgICAgIGwgPSBtaWQrMTsKICAgICAgICB9IGVsc2UgciA9IG1pZC0xOwogICAgfQoKICAgIGNvdXQgPDwgVCA8PCBlbmRsOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE07IGorKykgewogICAgICAgICAgICBpZiAoaiAhPSAwKSBjb3V0IDw8ICIgIjsKICAgICAgICAgICAgY291dCA8PCAoZGlzdFtpXVtqXSA+PSBUID8gJ1gnIDogJy4nKTsKICAgICAgICB9CiAgICAgICAgY291dCA8PCBlbmRsOwogICAgfQp9Cg==