#include <cstdio>
#include <cstring>
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int T;
scanf("%d", &T);
for(int i=1; i<=T; ++i) // число циклов = числу указанному в первой строке input.txt
{
int H, W;
scanf("%d%d", &H, &W); // H-высота и W-ширина таблицы
char LRUD[101]; // символьный массив на 100 символов + символ конца строки
scanf("%s", LRUD);
int ARR[100][100];
for(int i=0; i<H; ++i)
for(int j=0; j<W; ++j)
scanf("%d", &ARR[i][j]); // заполнение двумерного массива
for(int i=0; i<H; ++i)
{
for (int j = 0; j < W; ++j)
{
int s = ARR[i][j], i1=i, j1=j; // начало главного блока
for (int k = 0; k < strlen(LRUD); ++k)
{
if (LRUD[k] == 'L')
{
j1=j1-1;
s = s + ARR[i1][j1];
if(j1<0) s=-2000000000; // если выход за пределы таблицы
} // то переменной присваивается отрицательное значение
if (LRUD[k] == 'R') // заведомо превосходящее сумму положительных
{
j1=j1+1;
s = s + ARR[i1][j1];
if(j1>=W) s=-2000000000;
}
if (LRUD[k] == 'U')
{
i1=i1-1;
s = s + ARR[i1][j1];
if(i1<0) s=-2000000000;
}
if (LRUD[k] == 'D')
{
i1=i1+1;
s = s + ARR[i1][j1];
if(i1>=H) s=-2000000000;
} // конец главного блока
}
if (s>0) printf("%d ", s); // вывод только чисел полученных без выхода
else printf("%d ", 0); //за пределы таблицы, иначе ноль
}
printf("\n"); // разбиение единой строки на подстроки
}
}
return 0;
}