← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

type FastReader struct {
	r *bufio.Reader
}

func NewFastReader() *FastReader {
	return &FastReader{r: bufio.NewReader(os.Stdin)}
}

func (fr *FastReader) NextInt() int {
	sign := 1
	val := 0
	c, err := fr.r.ReadByte()
	for err == nil && c <= ' ' {
		c, err = fr.r.ReadByte()
	}
	if err != nil {
		return 0
	}
	if c == '-' {
		sign = -1
		c, err = fr.r.ReadByte()
	}
	for err == nil && c > ' ' {
		val = val*10 + int(c-'0')
		c, err = fr.r.ReadByte()
	}
	return sign * val
}

func (fr *FastReader) Next() string {
	c, err := fr.r.ReadByte()
	for err == nil && c <= ' ' {
		c, err = fr.r.ReadByte()
	}
	if err != nil {
		return ""
	}
	buf := make([]byte, 0, 16)
	for err == nil && c > ' ' {
		buf = append(buf, c)
		c, err = fr.r.ReadByte()
	}
	return string(buf)
}

func main() {
	in := NewFastReader()
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	t := in.NextInt()
	for ; t > 0; t-- {
		n := in.NextInt()
		m := in.NextInt()

		seenW, seenB := false, false
		minRowW, maxRowW := n+1, 0
		minColW, maxColW := m+1, 0
		minRowB, maxRowB := n+1, 0
		minColB, maxColB := m+1, 0

		for i := 1; i <= n; i++ {
			row := in.Next()
			for j := 1; j <= m; j++ {
				ch := row[j-1]
				if ch == 'W' {
					seenW = true
					if i < minRowW {
						minRowW = i
					}
					if i > maxRowW {
						maxRowW = i
					}
					if j < minColW {
						minColW = j
					}
					if j > maxColW {
						maxColW = j
					}
				} else {
					seenB = true
					if i < minRowB {
						minRowB = i
					}
					if i > maxRowB {
						maxRowB = i
					}
					if j < minColB {
						minColB = j
					}
					if j > maxColB {
						maxColB = j
					}
				}
			}
		}

		ok := false
		if seenW && minRowW == 1 && maxRowW == n && minColW == 1 && maxColW == m {
			ok = true
		}
		if seenB && minRowB == 1 && maxRowB == n && minColB == 1 && maxColB == m {
			ok = true
		}

		if ok {
			fmt.Fprintln(out, "YES")
		} else {
			fmt.Fprintln(out, "NO")
		}
	}
}
```