#include <iostream>
#include <vector>
#include <climits>
#include <queue>
#include <algorithm>
using namespace std;
struct node
{
int x,y;
node(int x1,int y1)
{
x=x1;
y=y1;
}
};
struct node2
{
int x,y;
char d;
node2(int x1,int y1,char d1)
{
x=x1;
y=y1;
d=d1;
}
};
node2* prev1[1001][1001];
int rows[]={0,1,0,-1};
int cols[]={1,0,-1,0};
char dir[]={'R','D','L','U'};
int startPlayeri=-1;
int startPlayerj=-1;
vector<node*> monsterLocations;
int monsterTime[1001][1001];
int playerTime[1001][1001];
int possible=0;
int visited[1001][1001];
bool isValid(int x,int y,int n,int m)
{
return x>=0 && y>=0 && x<n && y<m;
}
bool isEdge(int x,int y,int n,int m)
{
return (x==0) || (y==0) || (x==(n-1)) || (y==(m-1));
}
void constructPath(int x,int y)
{
cout<<"YES"<<endl;
node2* val = prev1[x][y];
string result = "";
while(val->x != -1)
{
//cout<<"x="<<val->x<<" y="<<val->y<<" d="<<val->d<<endl;
result+=val->d;
val = prev1[val->x][val->y];
}
reverse(result.begin(),result.end());
cout<<result.length()<<endl;
cout<<result<<endl;
return;
}
int main() {
int n,m;
cin>>n>>m;
vector<string> grid;
for(int i=0;i<n;i++)
{
string x;
cin>>x;
grid.push_back(x);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
monsterTime[i][j]=INT_MAX;
playerTime[i][j]=INT_MAX;
visited[i][j]=0;
if(grid[i][j] == 'A')
{
startPlayeri = i;
startPlayerj = j;
playerTime[i][j]=0;
}
if(grid[i][j] == 'M')
{
monsterLocations.push_back(new node(i,j));
monsterTime[i][j]=0;
}
}
}
queue<node*> Q;
for(int i=0;i<monsterLocations.size();i++)
{
Q.push(monsterLocations[i]);
}
while(!Q.empty())
{
node*x = Q.front();
Q.pop();
int newTime = monsterTime[x->x][x->y]+1;
for(int i=0;i<4;i++)
{
int X = x->x + rows[i];
int Y = x->y + cols[i];
char direction = dir[i];
if(isValid(X,Y,n,m) && grid[X][Y] != '#' && monsterTime[X][Y] > newTime)
{
Q.push(new node(X,Y));
monsterTime[X][Y] = newTime;
}
}
}
queue<node2*> Q2;
Q2.push(new node2(startPlayeri,startPlayerj,'*'));
prev1[startPlayeri][startPlayerj] = new node2(-1,-1,'*');
while(!Q2.empty())
{
node2*x = Q2.front();
Q2.pop();
visited[x->x][x->y]=1;
//cout<<"x="<<x->x<<" y="<<x->y<<" isEdge="<<isEdge(x->x,x->y,n,m)<<endl;
if(isEdge(x->x,x->y,n,m))
{
possible=1;
constructPath(x->x,x->y);
return 0;
}
int newTime = playerTime[x->x][x->y]+1;
//cout<<"newTime="<<newTime<<endl;
for(int i=0;i<4;i++)
{
int X = x->x + rows[i];
int Y = x->y + cols[i];
char direction = dir[i];
if(isValid(X,Y,n,m) && grid[X][Y] != '#' && visited[X][Y]==0 && monsterTime[X][Y] > newTime)
{
visited[X][Y]=1;
node2* nod = new node2(X,Y,direction);
Q2.push(nod);
playerTime[X][Y] = newTime;
prev1[X][Y] = new node2(x->x,x->y,direction);
}
}
}
if(possible == 0)
{
cout<<"NO"<<endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y2xpbWl0cz4KI2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IG5vZGUKewoJaW50IHgseTsKCW5vZGUoaW50IHgxLGludCB5MSkKCXsKCQl4PXgxOwoJCXk9eTE7Cgl9Cn07CgpzdHJ1Y3Qgbm9kZTIKewoJaW50IHgseTsKCWNoYXIgZDsKCW5vZGUyKGludCB4MSxpbnQgeTEsY2hhciBkMSkKCXsKCQl4PXgxOwoJCXk9eTE7CgkJZD1kMTsKCX0KfTsKCm5vZGUyKiBwcmV2MVsxMDAxXVsxMDAxXTsKaW50IHJvd3NbXT17MCwxLDAsLTF9OwppbnQgY29sc1tdPXsxLDAsLTEsMH07CmNoYXIgZGlyW109eydSJywnRCcsJ0wnLCdVJ307CmludCBzdGFydFBsYXllcmk9LTE7CmludCBzdGFydFBsYXllcmo9LTE7CnZlY3Rvcjxub2RlKj4gbW9uc3RlckxvY2F0aW9uczsKaW50IG1vbnN0ZXJUaW1lWzEwMDFdWzEwMDFdOwppbnQgcGxheWVyVGltZVsxMDAxXVsxMDAxXTsKaW50IHBvc3NpYmxlPTA7CmludCB2aXNpdGVkWzEwMDFdWzEwMDFdOwoKYm9vbCBpc1ZhbGlkKGludCB4LGludCB5LGludCBuLGludCBtKQp7CglyZXR1cm4geD49MCAmJiB5Pj0wICYmIHg8biAmJiB5PG07Cn0KCmJvb2wgaXNFZGdlKGludCB4LGludCB5LGludCBuLGludCBtKQp7CglyZXR1cm4gKHg9PTApIHx8ICh5PT0wKSB8fCAoeD09KG4tMSkpIHx8ICh5PT0obS0xKSk7Cn0KCnZvaWQgY29uc3RydWN0UGF0aChpbnQgeCxpbnQgeSkKewoJY291dDw8IllFUyI8PGVuZGw7Cglub2RlMiogdmFsID0gcHJldjFbeF1beV07CglzdHJpbmcgcmVzdWx0ID0gIiI7Cgl3aGlsZSh2YWwtPnggIT0gLTEpCgl7CgkJLy9jb3V0PDwieD0iPDx2YWwtPng8PCIgeT0iPDx2YWwtPnk8PCIgZD0iPDx2YWwtPmQ8PGVuZGw7CgkJcmVzdWx0Kz12YWwtPmQ7CgkJdmFsID0gcHJldjFbdmFsLT54XVt2YWwtPnldOwoJfQoJcmV2ZXJzZShyZXN1bHQuYmVnaW4oKSxyZXN1bHQuZW5kKCkpOwoJY291dDw8cmVzdWx0Lmxlbmd0aCgpPDxlbmRsOwoJY291dDw8cmVzdWx0PDxlbmRsOwoJcmV0dXJuOwp9CgoKaW50IG1haW4oKSB7CgoJaW50IG4sbTsKCWNpbj4+bj4+bTsKCQoJdmVjdG9yPHN0cmluZz4gZ3JpZDsKCWZvcihpbnQgaT0wO2k8bjtpKyspCgl7CgkJc3RyaW5nIHg7CgkJY2luPj54OwoJCWdyaWQucHVzaF9iYWNrKHgpOwoJfQoKCQoJZm9yKGludCBpPTA7aTxuO2krKykKCXsKCQlmb3IoaW50IGo9MDtqPG07aisrKQoJCXsKCQkJbW9uc3RlclRpbWVbaV1bal09SU5UX01BWDsKCQkJcGxheWVyVGltZVtpXVtqXT1JTlRfTUFYOwoJCQl2aXNpdGVkW2ldW2pdPTA7CgkJCWlmKGdyaWRbaV1bal0gPT0gJ0EnKQoJCQl7CgkJCQlzdGFydFBsYXllcmkgPSBpOwoJCQkJc3RhcnRQbGF5ZXJqID0gajsKCQkJCXBsYXllclRpbWVbaV1bal09MDsKCQkJfQoJCQkKCQkJaWYoZ3JpZFtpXVtqXSA9PSAnTScpCgkJCXsKCQkJCW1vbnN0ZXJMb2NhdGlvbnMucHVzaF9iYWNrKG5ldyBub2RlKGksaikpOwoJCQkJbW9uc3RlclRpbWVbaV1bal09MDsKCQkJfQoJCX0KCX0KCQoJcXVldWU8bm9kZSo+IFE7Cglmb3IoaW50IGk9MDtpPG1vbnN0ZXJMb2NhdGlvbnMuc2l6ZSgpO2krKykKCXsKCQlRLnB1c2gobW9uc3RlckxvY2F0aW9uc1tpXSk7Cgl9CgkKCXdoaWxlKCFRLmVtcHR5KCkpCgl7CgkJbm9kZSp4ID0gUS5mcm9udCgpOwoJCVEucG9wKCk7CgkJaW50IG5ld1RpbWUgPSBtb25zdGVyVGltZVt4LT54XVt4LT55XSsxOwoJCWZvcihpbnQgaT0wO2k8NDtpKyspCgkJewoJCQlpbnQgWCA9IHgtPnggKyByb3dzW2ldOwoJCQlpbnQgWSA9IHgtPnkgKyBjb2xzW2ldOwoJCQljaGFyIGRpcmVjdGlvbiA9IGRpcltpXTsKCQkJCgkJCWlmKGlzVmFsaWQoWCxZLG4sbSkgJiYgZ3JpZFtYXVtZXSAhPSAnIycgJiYgbW9uc3RlclRpbWVbWF1bWV0gPiBuZXdUaW1lKQoJCQl7CgkJCQlRLnB1c2gobmV3IG5vZGUoWCxZKSk7CgkJCQltb25zdGVyVGltZVtYXVtZXSA9IG5ld1RpbWU7CgkJCX0KCQl9Cgl9CgkKCXF1ZXVlPG5vZGUyKj4gUTI7CglRMi5wdXNoKG5ldyBub2RlMihzdGFydFBsYXllcmksc3RhcnRQbGF5ZXJqLCcqJykpOwoJcHJldjFbc3RhcnRQbGF5ZXJpXVtzdGFydFBsYXllcmpdID0gbmV3IG5vZGUyKC0xLC0xLCcqJyk7Cgl3aGlsZSghUTIuZW1wdHkoKSkKCXsKCQlub2RlMip4ID0gUTIuZnJvbnQoKTsKCQlRMi5wb3AoKTsKCQkKCQl2aXNpdGVkW3gtPnhdW3gtPnldPTE7CgkJLy9jb3V0PDwieD0iPDx4LT54PDwiIHk9Ijw8eC0+eTw8IiBpc0VkZ2U9Ijw8aXNFZGdlKHgtPngseC0+eSxuLG0pPDxlbmRsOwoJCQoJCWlmKGlzRWRnZSh4LT54LHgtPnksbixtKSkKCQl7CgkJCXBvc3NpYmxlPTE7CgkJCWNvbnN0cnVjdFBhdGgoeC0+eCx4LT55KTsKCQkJcmV0dXJuIDA7CgkJfQoJCQoJCWludCBuZXdUaW1lID0gcGxheWVyVGltZVt4LT54XVt4LT55XSsxOwoJCS8vY291dDw8Im5ld1RpbWU9Ijw8bmV3VGltZTw8ZW5kbDsKCQlmb3IoaW50IGk9MDtpPDQ7aSsrKQoJCXsKCQkJaW50IFggPSB4LT54ICsgcm93c1tpXTsKCQkJaW50IFkgPSB4LT55ICsgY29sc1tpXTsKCQkJY2hhciBkaXJlY3Rpb24gPSBkaXJbaV07CgkJCQoJCQlpZihpc1ZhbGlkKFgsWSxuLG0pICYmIGdyaWRbWF1bWV0gIT0gJyMnICYmIHZpc2l0ZWRbWF1bWV09PTAgJiYgbW9uc3RlclRpbWVbWF1bWV0gPiBuZXdUaW1lKQoJCQl7CgkJCQl2aXNpdGVkW1hdW1ldPTE7CgkJCQlub2RlMiogbm9kID0gbmV3IG5vZGUyKFgsWSxkaXJlY3Rpb24pOwoJCQkJUTIucHVzaChub2QpOwoJCQkJcGxheWVyVGltZVtYXVtZXSA9IG5ld1RpbWU7CgkJCQlwcmV2MVtYXVtZXSA9IG5ldyBub2RlMih4LT54LHgtPnksZGlyZWN0aW9uKTsKCQkJfQoJCX0KCQkKCX0KCQoJaWYocG9zc2libGUgPT0gMCkKCXsKCQljb3V0PDwiTk8iPDxlbmRsOwoJfQoJCgoJcmV0dXJuIDA7Cn0=