#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include #include #define inf 1e14 #define eps 1e-8 #define EPS 1e-4 using namespace std; int n, m; vector > a, b; vector > g; void build(int i) { for (int k = 0; k < n; ++k) { bool flag(false); for (int j = 0; j < m; ++j) { if (a[k][j] != b[i][j] && a[k][j] != '?') { flag = true; break; } } if (!flag) g[i].push_back(k); } } vector used; vector mt; bool try_kuhn(int v) { if (used[v]) return false; used[v] = 1; for (int i = 0; i < g[v].size(); ++i) { int to = g[v][i]; if (mt[to] == -1 || try_kuhn(mt[to])) { mt[to] = v; return true; } } return false; } int main() { //freopen("input.txt", "r", stdin); freopen("lots.in", "r", stdin); freopen("lots.out", "w", stdout); while (true) { scanf("%d %d\n", &n, &m); if (!n) { return 0; } g.clear(); a.assign(n, vector (m)); b.assign(n, vector (m)); g.resize(n); for (int i = 0; i < n; ++i){ for (int j = 0; j < m; ++j) scanf("%c", &a[i][j]); scanf("\n"); } scanf("\n"); for (int i = 0; i < n; ++i){ for (int j = 0; j < m; ++j) scanf("%c", &b[i][j]); scanf("\n"); } int w(0); bool flag(false); for (int j = 0; j < m; ++j) if (b[0][j] == 'x') w++; for (int i = 1; i < n; ++i) { int w0(0); for (int j = 0; j < m; ++j) if (b[i][j] == 'x') w0++; if (w0 > w) flag = true; else w = w0; } if (flag) { printf("NO\n"); continue; } for (int i = 0; i < n; ++i) build(i); mt.assign(n, -1); /*for (int i = 0; i < n; ++i) { for (int j = 0; j < g[i].size(); ++j) { if (mt[g[i][j]] == -1) { mt[g[i][j]] = i; break; } } }*/ for (int i = 0; i < n; ++i) { used.assign(n, false); try_kuhn(i); } bool f = 1; for (int i = 0; i < n; ++i) { if (mt[i] == -1) { printf("NO\n"); f = 0; break; } } if (f) { printf("YES\n"); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { printf("%c", b[mt[i]][j]); } printf("\n"); } } } return 0; }