#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <iomanip>
#include <vector>
#include <cmath>
#include <string>
#include <algorithm>
#include <queue>
#include <set>
#include <cassert>
#define inf 1e14
#define eps 1e-8
#define EPS 1e-4
using namespace std;
int n, m;
vector <vector <char> > a, b;
vector <vector <int> > 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 <int> used;
vector <int> 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 <char>(m));
b.assign(n, vector <char>(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;
}