/*
坑点有:
两层相对位置都是#的情况不可取
T时刻到达公主处可取
*/
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10 + 5;
char g[MAXN][MAXN][MAXN];
int dp[MAXN][MAXN][MAXN];
int n, m, T;
struct Node
{
int x, y, z;
Node(){}
Node(int _x, int _y, int _z) {x = _x, y = _y, z = _z;}
};
queue<Node>que;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
bool validPos(int x, int y) {if(x >= 0 && x < n && y >= 0 && y < m) return true; else return false;}
int main()
{
int Cas;
scanf("%d", &Cas);
while(Cas--) {
scanf("%d%d%d", &n, &m, &T);
for(int i = 0 ; i < 2 ; i++) for(int j = 0 ; j < n ; j++) scanf("%s", g[i][j]);
memset(dp, -1, sizeof dp);
int x, y, z;
// for(int i = 0 ; i < 2 ; i++) for(int j = 0 ; j < n ; j++) for(int k = 0 ; k < m ; k++)
// if(g[i][j][k] == 'S') x = i, y = j, z = k;
// dp[x][y][z] = 0;
while(!que.empty()) que.pop();
// que.push(Node(y, z, x));
que.push(Node(0,0,0));
dp[0][0][0] = 0;
while(!que.empty()) {
Node node = que.front(); que.pop();
if(dp[node.z][node.x][node.y] >= T) continue;
for(int i = 0 ; i < 4 ; i++) {
int tx = node.x + dx[i];
int ty = node.y + dy[i];
if(!validPos(tx, ty) || g[node.z][tx][ty] == '*') continue;
if(dp[node.z][tx][ty] == -1 || dp[node.z][tx][ty] > dp[node.z][node.x][node.y] + 1) {
dp[node.z][tx][ty] = dp[node.z][node.x][node.y] + 1;
if(g[node.z][tx][ty] == '#' && g[1 - node.z][tx][ty] != '*' && g[1 - node.z][tx][ty] != '#') {
if(dp[1 - node.z][tx][ty] == -1 || dp[1 - node.z][tx][ty] > dp[node.z][node.x][node.y] + 1) {
dp[1 - node.z][tx][ty] = dp[node.z][node.x][node.y] + 1;
que.push(Node(tx, ty, 1 - node.z));
}
}
if(g[node.z][tx][ty] != '#')
que.push(Node(tx, ty, node.z));
}
}
}
// for(int i = 0 ; i < 2 ; i++) {
// for(int j = 0 ; j < n ; j++) {
// for(int k = 0 ; k < m ; k++) printf("%d ", dp[i][j][k]);
// printf("\n");
// }
// puts("");
// }
for(int i = 0 ; i < 2 ; i++) for(int j = 0 ; j < n ; j++) for(int k = 0 ; k < m ; k++) if(g[i][j][k] == 'P') x=i,y=j,z=k;
if(dp[x][y][z] <= T && dp[x][y][z] != -1) puts("YES");
else puts("NO");
}
return 0;
}