#include <bits/stdc++.h>
using namespace std;
int const N = 20, M = N * N, Z = M * 2;
char g[N][N + 1], an[N * 2][N * 2];
int n, m, fr[M], pa[M], nm, tp[Z], bck[Z];
bool ed[Z][Z], in[Z], vis[Z];
int P(int v) { return pa[v] < 0 ? v : pa[v] = P(pa[v]); }
struct I {
  int a, b;
  I(int x, int y) : a(x), b(y) {
    y = x % m;
    x = x / m;
    if (y + x & 1) swap(a, b);
  }
};
void cl() {
  fill(fr, fr + nm, 0);
  fill(pa, pa + nm, -1);
}
void ad(I const &v) {
  int a = P(v.a), b = P(v.b);
  if (a != b) pa[b] = a;
  ++fr[v.a];
}
bool ok1(I const &v) { return P(v.a) != P(v.b); }
bool ok2(I const &v) { return fr[v.a] < 2; }
vector<I> matInt(vector<I> v) {
  int n = v.size();
  for (int i = 0; i < (int)(n); ++i) in[i] = false;
  queue<int> q;
  while (true) {
    cl();
    for (int i = 0; i < (int)(n); ++i)
      if (in[i]) ad(v[i]);
    bool es = false;
    for (int i = 0; i < (int)(n); ++i)
      if (!in[i]) {
        bool a = ok1(v[i]), b = ok2(v[i]);
        if (a && b) {
          in[i] = true;
          es = true;
          break;
        }
        tp[i] = a | b * 2;
      } else
        tp[i] = 0;
    if (es) continue;
    for (int i = 0; i < (int)(n); ++i)
      if (in[i]) {
        cl();
        for (int j = 0; j < (int)(n); ++j)
          if (in[j] && i != j) ad(v[j]);
        for (int j = 0; j < (int)(n); ++j)
          if (!in[j]) {
            ed[i][j] = ok1(v[j]);
            ed[j][i] = ok2(v[j]);
          }
      }
    while (!q.empty()) q.pop();
    for (int i = 0; i < (int)(n); ++i)
      if (tp[i] == 1) {
        vis[i] = true;
        q.push(i);
        bck[i] = -1;
      } else
        vis[i] = false;
    int o = -1;
    while (!q.empty()) {
      int v = q.front();
      q.pop();
      for (int i = 0; i < (int)(n); ++i)
        if (in[v] != in[i] && ed[v][i] && !vis[i]) {
          vis[i] = true;
          bck[i] = v;
          if (tp[i] == 2) {
            o = i;
            break;
          }
          q.push(i);
        }
      if (o != -1) break;
    }
    if (o == -1) break;
    while (o != -1) {
      in[o] ^= 1;
      o = bck[o];
    }
  }
  vector<I> an;
  for (int i = 0; i < (int)(n); ++i)
    if (in[i]) an.push_back(v[i]);
  return an;
}
void solve() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < (int)(n); ++i) scanf("%s", g[i]);
  nm = n * m;
  vector<I> v, u;
  for (int i = 0; i < (int)(n); ++i)
    for (int j = 1; j < (int)(m); ++j)
      if (g[i][j - 1] == 'O' && g[i][j] == 'O' && !(i == 0 && j == 1))
        v.emplace_back(i * m + j - 1, i * m + j);
  for (int i = 1; i < (int)(n); ++i)
    for (int j = 0; j < (int)(m); ++j)
      if (g[i - 1][j] == 'O' && g[i][j] == 'O' && !(i == 1 && j == 0))
        v.emplace_back((i - 1) * m + j, i * m + j);
  u = matInt(v);
  cl();
  for (I &t : u) ad(t);
  if (g[0][1] == 'O') v.emplace_back(0, 1);
  if (g[1][0] == 'O') v.emplace_back(0, m);
  for (I &t : v)
    if (ok1(t)) {
      ad(t);
      u.push_back(t);
    }
  for (int i = 0; i < (int)(n); ++i)
    for (int j = 0; j < (int)(m); ++j)
      if (i + j && !(i + j & 1) && g[i][j] == 'O' && fr[i * m + j] < 2) {
        printf("NO\n");
        return;
      }
  for (int i = 0; i < (int)(n); ++i)
    for (int j = 0; j < (int)(m); ++j) {
      an[i << 1][j << 1] = g[i][j];
      an[i << 1 | 1][j << 1] = ' ';
      an[i << 1][j << 1 | 1] = j + 1 == m ? 0 : ' ';
      an[i << 1 | 1][j << 1 | 1] = j + 1 == m ? 0 : ' ';
    }
  for (I &t : u) an[t.a / m + t.b / m][t.a % m + t.b % m] = 'O';
  printf("YES\n");
  for (int i = 0; i < (int)(2 * n - 1); ++i) printf("%s\n", an[i]);
}
int main() {
  int t;
  scanf("%d", &t);
  while (t--) solve();
}
