#include <bits/stdc++.h>
using namespace std;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9') {
if(ch == '-') {
f = -1;
}
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
x = x * 10 + ch - 48;
ch = getchar();
}
return x * f;
}
inline void print(int x) {
if(x < 0) {
putchar('-');
x = -x;
}
if(x > 9) {
print(x / 10);
}
putchar(x % 10 + 48);
}
constexpr int N = 1e6 + 10;
int T;
int n, m;
int a;
int sum;
int tag[N], ta;
int in[N];
string s[N];
vector <int> vec[N];
inline void dfs(int x) {
if(tag[x]) {
return ;
}
tag[x] = 1;
for(int y : vec[x]) {
dfs(y);
}
}
int main() {
T = read();
while(T--) {
n = read(), m = read();
for(int i = 1; i <= n; i++) {
cin >> s[i];
s[i] = ' ' + s[i];
}
sum = 0;
vec[N].clear();
memset(tag, 0, sizeof(tag));
ta = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
a = read();
if(s[i][j] == 'u') {
if(i - a >= 1) {
vec[(i - 1) * m + j].push_back((i - 1 - a) * m + j);
in[(i - 1 - a) * m + j]++;
}
}
else if(s[i][j] == 'd') {
if(i + a <= n) {
vec[(i - 1) * m + j].push_back((i + a - 1) * m + j);
in[(i + a - 1) * m + j]++;
}
}
else if(s[i][j] == 'l') {
if(j - a >= 1) {
vec[(i - 1) * m + j].push_back((i - 1) * m + j - a);
in[(i - 1) * m + j - a]++;
}
}
else if(s[i][j] == 'r') {
if(j + a <= m) {
vec[(i - 1) * m + j].push_back((i - 1) * m + j + a);
in[(i - 1) * m + j + a]++;
}
}
}
}
for(int i = 1; i <= n * m; i++) {
if(in[i] == 0) {
sum++;
dfs(i);
break;
}
}
for(int i = 1; i <= n * m; i++) {
if(tag[i] == 0) {
ta++;
}
}
if(ta == 0) {
cout << "Yes" << "\n";
}
else {
cout << "No" << "\n";
}
}
return 0;
}