#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,m;
char c[4111][4111];
struct node{
int to,nxt;
}w[20000005];
int h[20000005],cnt=0;
int lst[4000005];
int id(int x,int y){ return (x-1)*m+y; }
int iidx(int xx){ return xx%m==0?xx/m:xx/m+1; }
int iidy(int xx){ return xx-(iidx(xx)-1)*m; }
char f(int xx,int yy,int x,int y){
if(xx==x-1&&yy==y) return 'U';
if(xx==x+1&&yy==y) return 'D';
if(xx==x&&yy==y-1) return 'L';
if(xx==x&&yy==y+1) return 'R';
return 'A';
}
void Link(int x,int y){
++cnt;
w[cnt].to=y;
w[cnt].nxt=h[x];
h[x]=cnt;
return ;
}
int dis[1000005];
bool vis[1000005];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
void dijkstra(int st){
for(int i=1;i<=n*m;i++) dis[i]=LLONG_MAX;
memset(vis,false,sizeof(vis));
dis[st]=0;
q.push(make_pair(0,st));
while(!q.empty()){
int x=q.top().second;
q.pop();
if(vis[x]) continue;
vis[x]=true;
for(int i=h[x];i!=0;i=w[i].nxt){
int y=w[i].to;
if(dis[y]>dis[x]+1){
dis[y]=dis[x]+1;
lst[y]=x;
if(!vis[y]) q.push(make_pair(dis[y],y));
}
}
}
return ;
}
signed main(){
cin>>t;
while(t--){
string str="";
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c[i][j];
}
}
cnt=0;
for(int i=1;i<=n*m;i++) lst[i]=0;
for(int i=1;i<=n*m;i++) w[i]=(node){0,0};
for(int i=1;i<=n*m;i++) h[i]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i!=1&&c[i-1][j]!=c[i][j]) Link(id(i,j),id(i-1,j));
if(i!=n&&c[i+1][j]!=c[i][j]) Link(id(i,j),id(i+1,j));
if(j!=1&&c[i][j-1]!=c[i][j]) Link(id(i,j),id(i,j-1));
if(j!=m&&c[i][j+1]!=c[i][j]) Link(id(i,j),id(i,j+1));
}
}
dijkstra(1);
if(dis[id(n,m)]==LLONG_MAX){
printf("-1\n");
continue;
}
cout<<dis[id(n,m)]<<endl;
int k=id(n,m);
int uu=dis[id(n,m)];
while(uu--){
int ux=iidx(k),uy=iidy(k);
k=lst[k];
int vx=iidx(k),vy=iidy(k);
str=f(ux,uy,vx,vy)+str;
}
cout<<str<<endl;
}
return 0;
}