#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define mogaAc ios_base::sync_with_stdio(false);
#define fi first
#define nd second
int arr[1005][1005];
bool visited[1005][1005];
int cost[1005][1005];
int n, m;
void bfs(int i, int j)
{
deque<pair<int, int>> urutan;
urutan.push_back({i, j});
visited[i][j] = true;
cost[i][j] = 0;
int letaki, letakj;
while (!urutan.empty())
{
letaki = urutan.front().first;
letakj = urutan.front().second;
urutan.pop_front();
if (arr[letaki][letakj] == 2)
{
cout << "YES" << endl;
cout << cost[letaki][letakj] << endl;
string path = "";
int jarak2 = cost[letaki][letakj];
int now1 = letaki;
int now2 = letakj;
while (jarak2 > 1)
{
if (now1 + 1 < n && cost[now1 + 1][now2] == jarak2 - 1 && arr[now1 + 1][now2] != 0)
{
path = "U" + path;
now1++;
}
else if (now1 - 1 >= 0 && cost[now1 - 1][now2] == jarak2 - 1 && arr[now1 - 1][now2] != 0)
{
path = "D" + path;
now1--;
}
else if (now2 + 1 < m && cost[now1][now2 + 1] == jarak2 - 1 && arr[now1][now2 + 1] != 0)
{
path = "L" + path;
now2++;
}
else if (now2 - 1 >= 0 && cost[now1][now2 - 1] == jarak2 - 1 && arr[now1][now2 - 1] != 0)
{
path = "R" + path;
now2--;
}
jarak2--;
}
if (now1 + 1 < n && cost[now1 + 1][now2] == jarak2 - 1 && arr[now1 + 1][now2] == 3)
{
path = "U" + path;
now1++;
}
else if (now1 - 1 >= 0 && cost[now1 - 1][now2] == jarak2 - 1 && arr[now1 - 1][now2] == 3)
{
path = "D" + path;
now1--;
}
else if (now2 + 1 < m && cost[now1][now2 + 1] == jarak2 - 1 && arr[now1][now2 + 1] == 3)
{
path = "L" + path;
now2++;
}
else if (now2 - 1 >= 0 && cost[now1][now2 - 1] == jarak2 - 1 && arr[now1][now2 - 1] == 3)
{
path = "R" + path;
now2--;
}
cout << path << endl;
exit(0);
}
if (letaki + 1 < n && arr[letaki + 1][letakj] > 0 && !visited[letaki + 1][letakj])
{
urutan.push_back({letaki + 1, letakj});
cost[letaki + 1][letakj] = cost[letaki][letakj] + 1;
visited[letaki + 1][letakj] = true;
}
if (letaki - 1 >= 0 && arr[letaki - 1][letakj] > 0 && !visited[letaki - 1][letakj])
{
urutan.push_back({letaki - 1, letakj});
cost[letaki - 1][letakj] = cost[letaki][letakj] + 1;
visited[letaki - 1][letakj] = true;
}
if (letakj + 1 < m && arr[letaki][letakj + 1] > 0 && !visited[letaki][letakj + 1])
{
urutan.push_back({letaki, letakj + 1});
cost[letaki][letakj + 1] = cost[letaki][letakj] + 1;
visited[letaki][letakj + 1] = true;
}
if (letakj - 1 >= 0 && arr[letaki][letakj - 1] > 0 && !visited[letaki][letakj - 1])
{
urutan.push_back({letaki, letakj - 1});
cost[letaki][letakj - 1] = cost[letaki][letakj] + 1;
visited[letaki][letakj - 1] = true;
}
}
cout << "NO" << endl;
return;
}
int main()
{
mogaAc;
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
int Awali = 0;
int Awalj = 0;
int letakB1 = 0;
int letakB2 = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
char a;
cin >> a;
if (a == '.')
{
arr[i][j] = 1;
}
if (a == 'A')
{
arr[i][j] = 3;
Awali = i;
Awalj = j;
}
if (a == 'B')
{
arr[i][j] = 2;
letakB1 = i;
letakB2 = j;
}
}
}
if ((arr[letakB1 + 1][letakB2] == 0 || letakB1 + 1 >= n) && (arr[letakB1 - 1][letakB2] == 0 || letakB1 - 1 < 0) && (arr[letakB1][letakB2 + 1] == 0 || letakB2 + 1 >= m) && (arr[letakB1][letakB2 - 1] == 0 || letakB2 < 0))
{
cout << "NO" << endl;
return 0;
}
bfs(Awali, Awalj);
return 0;
}
// int main()
// {
// vector<int> a;
// a.pb(4);
// a.pb(5);
// a.pb(8);
// a.pb(7);
// vector<int> b;
// b = a;
// for (int i = 0; i < b.size(); i++)
// {
// cout << b[i] << endl;
// }
// }
// arrayy------------------------------------------------------
// buat ngecek array 1 apakah sama dengan array 2:
// bool sama = equal(arr, arr + size, arr1);
// buat ngecek besar dari array:
// int size = sizeof(arr) / sizeof(arr[0]);
// indexke LowerBound/upperbound
// auto it = upper_bound(arr.begin(), arr.end(), x);
// int index = distance(arr.begin(), it);
// cara cepet buat sorting-------------------------------------
// dari kecil ke besar : sort(arr.begin(), arr.end());
// dari besar ke kecil : sort(arr.begin(), arr.end(), greater<int>());
// logaritma
// anggap a=base, b=yang ingin di log, seperti logA (B)
// rumus : log(b)/log(a)
// Statitiska
// menghitung rata rata data tambahan baru
// R0 * (S0/S1) + (Data baru)/S1
// R = Rata rata
// S = Banyak data
// 0 = yang lama
// 1 = yang baru
// ArrayGACORBINSERT (KALAU ELEMENTNYA CUMA 1)
// set atau map