#include using namespace std; #define FOR(i, a, b) for (int i=(a); i<(b); i++) #define ALL(w) w.begin(), w.end() #define SZ(x) ((int)(x).size()) #define pb push_back const int maxN = 123, maxR = 2999; char T[maxN][maxN], out[maxR + 2][maxR + 2], xx = '#' ^ '.'; vector sons[maxN * maxN]; string word; int id[maxN][maxN]; int di[4] = {-1, 0, 1, 0}; int dj[4] = {0, 1, 0, -1}; void dfs(int i, int j) { FOR(s, 0, 4) { int a = i + di[s], b = j + dj[s]; if (T[a][b] == T[i][j] and id[a][b] == 0) id[a][b] = id[i][j], dfs(a, b); } } void getw(int v) { if (!sons[v].empty()) word.pb('a' + (sons[v].size() - 1)); for (int u : sons[v]) getw(u); } void go(int I, int J, int n, int m, int lid, char sgn) { if (lid == SZ(word)) { FOR(i, 0, n) FOR(j, 0, m) out[I + i][J + j] = sgn; return; } for (int i : {I, I + 1, I + 2, I + n-1}) FOR(j, J, J+m) out[i][j] = sgn; FOR(i, I, I+n) out[i][J] = out[i][J + m-1] = sgn; int fake = (word[lid] - 'a'); for (int j=J+1; fake--; j+=2) out[I + 1][j] = sgn ^ xx; go(I + 3, J + 1, n-4, m-2, lid+1, sgn ^ xx); } int main() { int n, m; scanf ("%d%d", &n, &m); FOR(i, 1, n+1) scanf ("%s", &T[i][1]); FOR(i, 1, n+1) FOR(j, 1, m+1) if (id[i][j] == 0) { int& v = id[i][j]; FOR(s, 0, 4) { int a = i + di[s], b = j + dj[s]; v = max(v, id[a][b]); } sons[v].pb(v + 1); v++; dfs(i, j); } getw(1); reverse(ALL(word)); go(0, 0, maxR, maxR, 0, '#'); printf("%d %d\n", maxR, maxR); FOR(i, 0, maxR) printf("%s\n", out[i]); return 0; }