#include<bits/stdc++.h>
using namespace std;
int mov[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };//0上 1右 2下 3左
char OP[4] = { 'U','R','D','L' };
void solve() {
int n, m;
cin >> n >> m;
vector<vector<char>> grid(n + 1, vector<char>(m + 1));
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
cin >> grid[i][j];
if (n == 1 && m == 1) {
cout << 0 << endl; return;
}
vector<vector<char>> op(n + 1, vector<char>(m + 1, '?'));
vector<vector<bool>> visited(n + 1, vector<bool>(m + 1, false));
queue<pair<int, int>> que;
que.push({ 1,1 });
visited[1][1] = true;
int level = 0;
while (que.size()) {
++level;
int sz = que.size();
while (sz--) {
pair<int, int> pr = que.front(); que.pop();
int x = pr.first, y = pr.second;
for (int t = 0; t < 4; ++t) {
int nx = x + mov[t][0];
int ny = y + mov[t][1];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && visited[nx][ny] == false && (grid[x][y] != grid[nx][ny])) {
que.push({ nx,ny });
visited[nx][ny] = true;
op[nx][ny] = OP[t];
}
}
}
if (visited[n][m]) break;
}
if (visited[n][m] == false) cout << -1 << endl;
else {
cout << level << endl;
stack<char> st;
for (int i = n, j = m; i != 1 || j != 1;) {
st.push(op[i][j]);
if (op[i][j] == 'L') {
j += 1;
}
else if (op[i][j] == 'R') {
j -= 1;
}
else if (op[i][j] == 'U') {
i += 1;
}
else if(op[i][j]=='D') {
i -= 1;
}
}
while(st.size()) {
cout << st.top();
st.pop();
}
}
}
int main() {
int t;
cin >> t;
while (t--) solve();
return 0;
}