import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;

import java.util.*;

public class Main {

    static int[] diff_y = {0, 0, 1, -1};
    static int[] diff_x = {1, -1, 0, 0};

    static class Pair{
        public int x;
        public int y;
        public Pair(int x,int y) {
            this.x=x;
            this.y=y;
        }
        @Override
        public boolean equals(Object obj) {
            if(obj instanceof Pair) {
                Pair other = (Pair) obj;
                return other.x==this.x && other.y==this.y;
            }
            return false;
        }
        @Override
        public int hashCode() {
            return Objects.hash(this.x,this.y);
        }
    }

    public static void main(String[] args) {
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        InputReader in = new InputReader(inputStream);
        PrintWriter out = new PrintWriter(outputStream);

        // diff_y = {0, 0, 1, -1};
        // diff_x = {1, -1, 0, 0};

        int t = in.nextInt();
        for (int i=0;i<t;i++) {
            int n = in.nextInt();
            int m = in.nextInt();
            char[][] c = new char[n][m];
            HashSet<Pair> good_coordinate = new HashSet<Pair>();
            for (int j=0;j<n;j++) {
                String S = in.next();
                for (int k=0;k<m;k++) {
                    c[j][k] = S.charAt(k);
                    if (c[j][k] == 'G') {
                        Pair pair = new Pair(k, j);
                        good_coordinate.add(pair);
                    }
                }
            }

            boolean flag = true;

            for (int j=0;j<n;j++) {
                for (int k=0;k<m;k++) {
                    if (c[j][k] == 'B') {
                        for (int l=0;l<4;l++) {
                            if (j+diff_y[l]<0 || n<=j+diff_y[l] || k+diff_x[l]<0 || m<=k+diff_x[l]) continue;
                            else {
                                if (c[j+diff_y[l]][k+diff_x[l]] == 'G') {
                                    flag = false;
                                }
                                c[j+diff_y[l]][k+diff_x[l]] = '#';
                            }
                        }
                    }
                }
            }

            if (!flag) {
                out.println("No");
            } else {

                int[][] visited = new int[n][m];
                int number = 0;
                boolean all_ok = true;
                for (Pair p : good_coordinate) {
                    number++;
                    int fy = p.y;
                    int fx = p.x;
                    Pair first = new Pair(fx, fy);
                    ArrayDeque<Pair> q = new ArrayDeque<Pair>();
                    q.add(first);
                    boolean can_reach = false;
                    while (!q.isEmpty()) {
                        Pair rem = q.remove();
                        if (visited[rem.y][rem.x]>0) {
                            if (visited[rem.y][rem.x] < number) can_reach = true;
                            continue;
                        }
                        visited[rem.y][rem.x] = number;

                        for (int l=0;l<4;l++) {
                            if (rem.y+diff_y[l]<0 || n<=rem.y+diff_y[l] || rem.x+diff_x[l]<0 || m<=rem.x+diff_x[l]) continue;
                            else if (c[rem.y+diff_y[l]][rem.x+diff_x[l]] == '#') continue;
                            else if (visited[rem.y+diff_y[l]][rem.x+diff_x[l]]>0) {
                                if (visited[rem.y+diff_y[l]][rem.x+diff_x[l]] < number) can_reach = true;
                                continue;
                            } else {
                                if (rem.y+diff_y[l] == n-1 && rem.x+diff_x[l] == m-1) can_reach = true;
                                Pair add = new Pair(rem.x+diff_x[l], rem.y+diff_y[l]);
                                q.add(add);
                            }
                        }
                    }
                    if ((!can_reach) || (visited[n-1][m-1] == 0)) all_ok = false;
                    // out.println("fy, fx: "+fy+" "+fx);
                    // out.println("all_ok: "+(all_ok));
                }

                if (all_ok) out.println("Yes");
                else out.println("No");

                // out.println(Arrays.deepToString(c));
                // out.println(Arrays.deepToString(visited));
            }
        }

        out.close();
    }

    static class InputReader {
        public BufferedReader reader;
        public StringTokenizer tokenizer;

        public InputReader(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public long nextLong() {
            return Long.parseLong(next());
        }

    }
}
