#include <bits/stdc++.h>
using namespace std;
int N, M;
vector<vector<int>> adj;
vector<bool> visited;
vector<string> vec;
void dfs(int root) {
  visited[root] = true;
  for (int i = 0; i < (int)adj[root].size(); i++) {
    int child = adj[root][i];
    if (vec[child / M][child % M] == '#') continue;
    if (visited[child]) continue;
    if (vec[child / M][child % M] == 'B') {
      vec[root / M][root % M] = '#';
      continue;
    }
    dfs(child);
  }
}
void dfs2(int root) {
  if (vec[root / M][root % M] == '#') return;
  visited[root] = true;
  for (int i = 0; i < (int)adj[root].size(); i++) {
    int child = adj[root][i];
    if (visited[child]) continue;
    dfs2(child);
  }
}
bool valid(int i, int j) {
  if (i < 0 || i >= N || j < 0 || j >= M) return false;
  if (vec[i][j] == '#') return false;
  return true;
}
void solve() {
  cin >> N >> M;
  vec.clear();
  vec.resize(N);
  for (int i = 0; i < (N); i++) cin >> vec[i];
  ;
  visited.clear();
  adj.clear();
  adj.resize(N * M);
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < M; j++) {
      if (vec[i][j] == '#') continue;
      if (valid(i - 1, j)) adj[i * M + j].push_back((i - 1) * M + j);
      if (valid(i + 1, j)) adj[i * M + j].push_back((i + 1) * M + j);
      if (valid(i, j - 1)) adj[i * M + j].push_back(i * M + j - 1);
      if (valid(i, j + 1)) adj[i * M + j].push_back(i * M + j + 1);
    }
  }
  visited.resize(N * M);
  for (int i = 0; i < N * M; i++) visited[i] = false;
  dfs(N * M - 1);
  visited.resize(N * M);
  for (int i = 0; i < N * M; i++) visited[i] = false;
  dfs2(N * M - 1);
  for (int i = 0; i < N * M; i++) {
    if (vec[i / M][i % M] == 'G' && visited[i] == false) {
      cout << "No" << endl;
      return;
    }
  }
  cout << "Yes" << endl;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int T;
  cin >> T;
  while (T--) {
    solve();
  }
  return 0;
}
