#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n,m;
int a[2010][2010];
bool vis[2010][2010];
char way[2010][2010];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
struct node{
int x,y,step;
};
char aaa[4000010];
void out(){
int i=0;
int x=n,y=m;
while(x!=1||y!=1){
aaa[++i]=way[x][y];
if(way[x][y]=='D'){
x-=1;
}
else if(way[x][y]=='U'){
x+=1;
}
else if(way[x][y]=='R'){
y-=1;
}
else{
y+=1;
}
}
for(int j=1;j<=i;j++){
printf("%c",aaa[j]);
}
printf("\n");
}
void bfs(){
queue<node>q;
q.push({1,1,0});
vis[1][1]=1;
while(!q.empty()){
int x=q.front().x,y=q.front().y,step=q.front().step;
q.pop();
if(x==n&&y==m){
printf("%d\n",step);
out();
return;
}
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx<1||ny<1||nx>n||ny>m){
continue;
}
if(a[nx][ny]==a[x][y]||vis[nx][ny]){
continue;
}
q.push({nx,ny,step+1});
vis[nx][ny]=1;
if(i==0){
way[nx][ny]='D';
}
else if(i==1){
way[nx][ny]='U';
}
else if(i==2){
way[nx][ny]='R';
}
else{
way[nx][ny]='L';
}
}
}
printf("-1\n");
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%1d",&a[i][j]);
}
}
memset(vis,0,sizeof vis);
bfs();
}
return 0;
}