import java.util.*;
import java.io.*;
import java.awt.*;
public class Solution{
    public static void main(String[] args)throws IOException{
        FastReader in=new FastReader();
        PrintWriter wr=new PrintWriter(System.out);
        int tc=in.nextInt();
        StringBuilder ans=new StringBuilder();
        while(tc-->0){
            int n=in.nextInt(),m=in.nextInt();
            int[][] mat=new int[n][m];
            int cntt=0;
            for(int i=0;i<n;i++){
                String s=in.next();
                //System.out.println(s);
                for(int j=0;j<m;j++){
                    char ch=s.charAt(j);
                    if(ch=='.')mat[i][j]=0;
                    else if(ch=='G'){mat[i][j]=2;cntt+=1;}
                    else if(ch=='B')mat[i][j]=1;
                    else mat[i][j]=-1;
                }
            }
            if(cntt==0 && !(mat[n-1][m-1]==1)){
                ans.append("Yes\n");
                //wr.flush();
                continue;
            }
            int[] a={1,-1,0,0};
            int[] b={0,0,1,-1};
            /*for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    wr.write(mat[i][j]+" ");
                }
                wr.write("\n");
                wr.flush();
            }*/
            for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    if(mat[i][j]==1){
                        for(int ii=0;ii<4;ii++){
                            int x=i+a[ii],y=j+b[ii];
                            if(x>=0 && x<n && y>=0 && y<m && mat[x][y]==0)mat[x][y]=-1;
                        }
                    }
                }
            }
            if(mat[n-1][m-1]==-1 || mat[n-1][m-1]==1){
                ans.append("No\n");
                //wr.flush();
                continue;
            }
            boolean ch=true;
            boolean[][] yes=new boolean[n][m];
            for(int i=0;i<n;i++)for(int j=0;j<m;j++)yes[i][j]=false;
            yes=bfs(mat,n-1,m-1);
            
            for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    if(mat[i][j]==2){
                        if(yes[i][j]==false){ch=false;break;}
                        /*boolean get=check(mat,i,j,n,m);
                        if(get==false){
                            ch=false;
                            break;
                        }
                        yes[i][j]=true;*/
                    }
                }
                if(ch==false)break;
            }
            if(ch==false){
                ans.append("No\n");
                //wr.flush();
                continue;
            }
            for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    if(mat[i][j]==1){
                        for(int ii=0;ii<4;ii++){
                            int x=i+a[ii],y=j+b[ii];
                            if(x>=0 && x<n && y>=0 && y<m && yes[x][y]==true){
                                ch=false;
                                break;
                            }
                        }
                    }
                }
            }
            if(ch==false)ans.append("No\n");
            else ans.append("Yes\n");
            //wr.flush();
        }
        wr.write(ans+"");
        wr.flush();
    }
    static boolean[][] bfs(int[][] mat,int n,int m){
        Point pt=new Point(n,m);
        Queue<Point> q=new LinkedList<Point>();
        q.add(pt);
        int[] a={1,-1,0,0};
        int[] b={0,0,1,-1};
        boolean[][] vis=new boolean[n+1][m+1];
        boolean[][] ret=new boolean[n+1][m+1];
        for(int ii=0;ii<=n;ii++){
            for(int jj=0;jj<=m;jj++){
                vis[ii][jj]=false;
                ret[ii][jj]=false;
            }
        }
        while(!q.isEmpty()){
            Point rem=q.remove();
            int x=(int)rem.getX(),y=(int)rem.getY();
            vis[x][y]=true;
            for(int ii=0;ii<4;ii++){
                int x1=x+a[ii],y1=y+b[ii];
                if(x1>=0 && x1<=n && y1>=0 && y1<=m && mat[x1][y1]!=-1 && vis[x1][y1]==false){
                    q.add(new Point(x1,y1));
                    ret[x1][y1]=true;
                    vis[x1][y1]=true;
                    //if(x1==n-1 && y1==m-1)return true;
                }
            }
        }
        return ret;
    }
    static boolean check(int[][] mat,int i,int j,int n,int m){
        Point pt=new Point(i,j);
        Queue<Point> q=new LinkedList<Point>();
        q.add(pt);
        int[] a={1,-1,0,0};
        int[] b={0,0,1,-1};
        boolean[][] vis=new boolean[n][m];
        for(int ii=0;ii<n;ii++)for(int jj=0;jj<m;jj++)vis[ii][jj]=false;
        while(!q.isEmpty()){
            Point rem=q.remove();
            int x=(int)rem.getX(),y=(int)rem.getY();
            vis[x][y]=true;
            for(int ii=0;ii<4;ii++){
                int x1=x+a[ii],y1=y+b[ii];
                if(x1>=0 && x1<n && y1>=0 && y1<m && mat[x1][y1]!=-1 && vis[x1][y1]==false){
                    q.add(new Point(x1,y1));
                    vis[x1][y1]=true;
                    if(x1==n-1 && y1==m-1)return true;
                }
            }
            //System.out.println("anant");
        }
        return false;
    }
}
class FastReader{
    public static StringTokenizer st;
    public static BufferedReader in;
    public static PrintWriter pw;
    FastReader(){
        in = new BufferedReader(new InputStreamReader(System.in));
        pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
        st = new StringTokenizer("");
    }
    public static int nextInt() throws IOException {
        return Integer.parseInt(next());
    }
    public static long nextLong() throws IOException {
        return Long.parseLong(next());
    }
    public static double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }
    public static String next() throws IOException {
        while(!st.hasMoreElements() || st == null){
            st = new StringTokenizer(in.readLine());
        }
        return st.nextToken();
    }
}