#include<bits/stdc++.h>
using namespace std;
struct node
{
int x;
int y;
string s;
int b;
};
int vis[2001][2001];
vector<string> a;
int main()
{
int t;
scanf("%d", &t);
for (int i=1;i<=t;i++)
{
memset(vis, 0, sizeof(vis));
a.clear();
int n, m;
scanf("%d %d", &n, &m);
a.push_back("");
for (int j=1;j<=n;j++)
{
string aa;
aa.resize(m);
scanf("%s", &aa[0]);
a.push_back(aa);
}
queue<node> q;
node z={1, 1, "", 0};
q.push(z);
while (!q.empty())
{
node head=q.front();
q.pop();
int x=head.x;
int y=head.y;
int b=head.b;
string s=head.s;
vis[x][y]=1;
if (x==n&&y==m)
{
printf("%d\n%s\n", b, s.c_str());
q.push({0, 0, "", 0});
break;
}
if (x<n&&vis[x+1][y]==0&&a[x+1][y-1]!=a[x][y-1])
{
node p={x+1, y, s+"D", b+1};
q.push(p);
}
if (x>1&&vis[x-1][y]==0&&a[x-1][y-1]!=a[x][y-1])
{
node p={x-1, y, s+"U", b+1};
q.push(p);
}
if (y<m&&vis[x][y+1]==0&&a[x][y+1-1]!=a[x][y-1])
{
node p={x, y+1, s+"R", b+1};
q.push(p);
}
if (y>1&&vis[x][y-1]==0&&a[x][y-1-1]!=a[x][y-1])
{
node p={x, y-1, s+"L", b+1};
q.push(p);
}
}
if (q.empty())
{
printf("-1\n");
}
}
return 0;
}