import sys
input = sys.stdin.readline

def get_from_maze(maze, pos):
    if pos[0] < 0 or pos[0] >= len(maze) or pos[1] < 0 or pos[1] >= len(maze[0]):
        return None
    return maze[pos[0]][pos[1]]

def is_poss(n, m):
    maze = []; bad_guys = set(); good_guys = set()
    deltas = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    for r in range(n):
        row = list(input())
        maze.append(row)
        for c, el in enumerate(row):
            pos = (r, c)
            if el == "G":
                good_guys.add(pos)
            elif el == "B":
                bad_guys.add(pos)
    #print(maze)
    for bgp in bad_guys:
        for delta in deltas:
            new_pos = bgp[0] + delta[0], bgp[1] + delta[1]
            currently_there = get_from_maze(maze, new_pos)
            if currently_there == ".":
                maze[new_pos[0]][new_pos[1]] = "#"
            elif currently_there == "G":
                return False
    #print(maze)
    to_do = [(n - 1, m - 1)]
    done = set()
    entrance = get_from_maze(maze, to_do[0])
    if entrance == "#":
        return len(good_guys) == 0
    elif entrance == "B":
        return False
    elif entrance == "G":
        good_guys.remove(to_do[0])
    while len(good_guys) > 0 and len(to_do) > 0:
        pos = to_do.pop(0)
        for delta in deltas:
            new_pos = pos[0] + delta[0], pos[1] + delta[1]
            #print(new_pos)
            if new_pos in done:
                continue
            done.add(new_pos)
            there = get_from_maze(maze, new_pos)
            if there == ".":
                to_do.append(new_pos)
            elif there == "G":
                to_do.append(new_pos)
                if new_pos in good_guys:
                    good_guys.remove(new_pos)
        done.add(pos)
    return len(good_guys) == 0

def main():
    t = int(input())
    for _ in range(t):
        n, m = map(int, input().split())
        if is_poss(n, m):
            print("YES")
        else:
            print("NO")

main()