#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using Vi = vector<int>;
using Pii = pair<int, int>;
int uplg(int n) { return 32 - __builtin_clz(n); }
int uplg(ll n) { return 64 - __builtin_clzll(n); }
void run();
int main() {
  cin.sync_with_stdio(0);
  cin.tie(0);
  cout << fixed << setprecision(18);
  run();
  return 0;
}
template <class T, class U>
vector<bool> intersectMatroids(T& A, U& B, int n) {
  vector<bool> ans(n);
  bool ok = 1;
  A.init(ans);
  B.init(ans);
  for (int i = (0); i < (n); i++)
    if (A.canAdd(i) && B.canAdd(i)) ans[i] = 1, A.init(ans), B.init(ans);
  while (ok) {
    vector<Vi> G(n);
    vector<bool> good(n);
    queue<int> que;
    Vi prev(n, -1);
    A.init(ans);
    B.init(ans);
    ok = 0;
    for (int i = (0); i < (n); i++)
      if (!ans[i]) {
        if (A.canAdd(i)) que.push(i), prev[i] = -2;
        good[i] = B.canAdd(i);
      }
    for (int i = (0); i < (n); i++)
      if (ans[i]) {
        ans[i] = 0;
        A.init(ans);
        B.init(ans);
        for (int j = (0); j < (n); j++)
          if (i != j && !ans[j]) {
            if (A.canAdd(j)) G[i].push_back(j);
            if (B.canAdd(j)) G[j].push_back(i);
          }
        ans[i] = 1;
      }
    while (!que.empty()) {
      int i = que.front();
      que.pop();
      if (good[i]) {
        ans[i] = 1;
        while (prev[i] >= 0) {
          ans[i = prev[i]] = 0;
          ans[i = prev[i]] = 1;
        }
        ok = 1;
        break;
      }
      for (auto& j : (G[i]))
        if (prev[j] == -1) que.push(j), prev[j] = i;
    }
  }
  return ans;
}
struct LimOracle {
  Vi color;
  Vi maxAllowed;
  Vi tmp;
  void init(vector<bool>& S) {
    tmp = maxAllowed;
    for (int i = (0); i < (int((S).size())); i++) tmp[color[i]] -= S[i];
  }
  bool canAdd(int k) { return tmp[color[k]] > 0; }
};
struct CographOracle {
  vector<Pii> elems;
  int n;
  vector<Vi> G;
  Vi pre, low;
  int cnt;
  int dfs(int v, int p) {
    pre[v] = low[v] = ++cnt;
    for (auto& e : (G[v]))
      if (e != p) low[v] = min(low[v], pre[e] ?: dfs(e, v));
    return low[v];
  }
  void init(vector<bool>& S) {
    G.assign(n, {});
    pre.assign(n, 0);
    low.resize(n);
    cnt = 0;
    for (int i = (0); i < (int((S).size())); i++)
      if (!S[i]) {
        Pii e = elems[i];
        G[e.first].push_back(e.second);
        G[e.second].push_back(e.first);
      }
    for (int v = (0); v < (n); v++)
      if (!pre[v]) dfs(v, -1);
  }
  bool canAdd(int k) {
    Pii e = elems[k];
    return max(pre[e.first], pre[e.second]) != max(low[e.first], low[e.second]);
  }
};
void solve() {
  int n, m;
  cin >> n >> m;
  vector<string> mat(n);
  for (auto& row : (mat)) cin >> row;
  LimOracle lim;
  CographOracle graph;
  vector<Pii> edgeMap;
  lim.maxAllowed.resize(n * m, -2);
  graph.n = n * m;
  auto consider = [&](int a, int b, int i, int j, int dstX, int dstY) {
    if (mat[i][j] != 'O') return;
    int c = (a + b) % 2 ? i * m + j : a * m + b;
    lim.color.push_back(c);
    lim.maxAllowed[c]++;
    graph.elems.push_back({a * m + b, i * m + j});
    edgeMap.push_back({dstX, dstY});
  };
  for (int i = (0); i < (n); i++)
    for (int j = (0); j < (m); j++)
      if (mat[i][j] == 'O') {
        if (i + 1 < n) consider(i, j, i + 1, j, i * 2 + 1, j * 2);
        if (j + 1 < m) consider(i, j, i, j + 1, i * 2, j * 2 + 1);
      }
  int cells = 0;
  for (int i = (0); i < (n); i++)
    for (int j = (0); j < (m); j++)
      if (mat[i][j] == 'O') {
        if ((i + j) % 2 == 0 && i + j > 0) {
          if (lim.maxAllowed[i * m + j] < 0) {
            cout << "NO\n";
            return;
          }
        } else {
          lim.maxAllowed[i * m + j] = 1e6;
        }
        cells++;
      }
  auto inter = intersectMatroids(graph, lim, int((graph.elems).size()));
  if (count((inter).begin(), (inter).end(), 0) != cells - 1) {
    cout << "NO\n";
    return;
  }
  vector<string> ans(n * 2 - 1, string(m * 2 - 1, ' '));
  for (int i = (0); i < (n); i++)
    for (int j = (0); j < (m); j++) ans[i * 2][j * 2] = mat[i][j];
  for (int i = (0); i < (int((inter).size())); i++)
    if (!inter[i]) {
      auto& p = edgeMap[i];
      ans[p.first][p.second] = 'O';
    }
  cout << "YES\n";
  for (auto& row : (ans)) cout << row << '\n';
}
void run() {
  int t;
  cin >> t;
  while (t--) solve();
}
