#include using namespace std; using ll = long long; constexpr ll mod = 1e18 + 3; int main(void) { int N, U, H, W; cin >> N >> U >> H >> W; int HW = H * W; vector p2(HW); p2[0] = 1; for(int i = 1; i < HW; ++i) { p2[i] = p2[i - 1] * 2; if(p2[i] >= mod) p2[i] -= mod; } unordered_map m; unordered_map ms; for(int x = 0; x < N; ++x) { int F; cin >> F; string T; for(int i = 0; i < H; ++i) { string S; cin >> S; T += S; } ll h = 0; for(int i = 0; i < HW; ++i) if(T[i] == '#') { h += p2[i]; if(h >= mod) h -= mod; } int tri = (x < U ? 1 : -1); if(m.find(h) == m.end()) ms[h] = T; m[h] += tri; if(F == 0) continue; for(int i = 0; i < HW; ++i) { ll hi = h + (T[i] == '#' ? -1 : 1) * p2[i]; if(hi < 0) hi += mod; if(hi >= mod) hi -= mod; if(m.find(hi) == m.end()) ms[hi] = T; m[hi] += tri; } } ll max_h = -1; for(int i = 0; i < (1 << min(25, HW)); ++i) if(m.find(i) == m.end()) { max_h = i; break; } m[-1] = -1e9; for(auto [h, val] : m) if(m[max_h] < val) max_h = h; string ans(HW, '.'); if(ms.find(max_h) != ms.end()) ans = ms[max_h]; else for(int i = 0; i < HW; ++i) if(max_h >> i & 1) ans[i] = '#'; cout << m[max_h] << "\n"; for(int i = 0; i < H; ++i) cout << ans.substr(i * W, W) << "\n"; return 0; }