from sys import stdin, stdout
from collections import deque

int_in = lambda: int(stdin.readline())
arr_in = lambda: [int(x) for x in stdin.readline().split()]
mat_in = lambda rows: [arr_in() for y in range(rows)]
str_in = lambda: stdin.readline().strip()
out = lambda o: stdout.write("{}\n".format(o))
arr_out = lambda o: out(" ".join(map(str, o)))
bool_out = lambda o: out("YES" if o else "NO")
tests = lambda: range(1, int_in() + 1)
case_out = lambda i, o: out("Case #{}: {}".format(i, o))


def solve(n, m, maze):
    g_count = 0
    for row in maze:
        for col in row:
            if col == "G":
                g_count += 1

    # if no B or G, return True
    # if only B return True (can block destination)
    if g_count == 0:
        return True

    # if B and G are adjacent, return False
    for i in range(n):
        for j in range(m):
            if maze[i][j] == "G":
                if i > 0 and maze[i - 1][j] == "B":
                    return False
                if i + 1 < n and maze[i + 1][j] == "B":
                    return False
                if j > 0 and maze[i][j - 1] == "B":
                    return False
                if j + 1 < m and maze[i][j + 1] == "B":
                    return False

    for i in range(n):
        for j in range(m):
            if maze[i][j] == "B":
                if i > 0 and maze[i - 1][j] == ".":
                    maze[i - 1][j] = "#"
                if i + 1 < n and maze[i + 1][j] == ".":
                    maze[i + 1][j] = "#"
                if j > 0 and maze[i][j - 1] == ".":
                    maze[i][j - 1] = "#"
                if j + 1 < m and maze[i][j + 1] == ".":
                    maze[i][j + 1] = "#"

    if maze[n - 1][m - 1] == "#":
        return False

    dfs = deque([(n - 1, m - 1)])
    visited = set()
    while len(dfs) > 0:
        curr = dfs.pop()
        visited.add(curr)
        i = curr[0]
        j = curr[1]
        if i > 0 and (i - 1, j) not in visited and maze[i - 1][j] != "#":
            dfs.append((i - 1, j))
        if i + 1 < n and (i + 1, j) not in visited and maze[i + 1][j] != "#":
            dfs.append((i + 1, j))
        if j > 0 and (i, j - 1) not in visited and maze[i][j - 1] != "#":
            dfs.append((i, j - 1))
        if j + 1 < m and (i, j + 1) not in visited and maze[i][j + 1] != "#":
            dfs.append((i, j + 1))

    for i in range(n):
        for j in range(m):
            if maze[i][j] == "G" and (i, j) not in visited:
                return False
            if maze[i][j] == "B" and (i, j) in visited:
                return False
    # otherwise return True if all G can exit
    return True




if __name__ == "__main__":
    for i in tests():
        n, m = arr_in()
        maze = [list(str_in()) for _ in range(n)]
        out("Yes" if solve(n, m, maze) else "No")