#include <iostream>
#include <queue>
using namespace std;
struct Bird{
int y, x;
};
struct Compare{
bool operator()(pair<int, Bird> p1, pair<int, Bird> p2) {
return p1.first < p2.first;
}
};
pair<int, int> dir[4] = {
make_pair(-1, 0), make_pair(1, 0), make_pair(0, -1), make_pair(0, 1)
};
int id = 1;
int R, C;
pair<int, int> dest;
int answer = -1;
char map[1500][1500] = {0,};
bool visited[1500][1500] = {false, };
int melted[1500][1500] = {false, };
int cache[1500][1500] = {false, };
priority_queue<pair<int, Bird>, vector<pair<int, Bird>>, Compare> bq;
void input(){
cin>>R>>C;
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
cin>>map[i][j];
if(map[i][j]!='X') melted[i][j] = true;
if(map[i][j]=='L'){
if(id==1){
Bird b;
b.y=i;
b.x=j;
id=-1;
bq.push(make_pair(0, b));
visited[b.y][b.x]=true;
}else{
dest=make_pair(i, j);
}
}
}
}
}
void melting(){
queue<pair<int, int>> q;
for(int y=0;y<R;y++){
for(int x=0;x<C;x++){
if(map[y][x]=='X') continue;
for(int i=0;i<4;i++){
int ny = y+dir[i].first;
int nx = x+dir[i].second;
if(melted[ny][nx]) continue;
if(ny<0||ny>=R||nx<0||nx>=C) continue;
if(map[ny][nx]=='X'){
melted[ny][nx] = true;
cache[ny][nx] = cache[y][x] + 1;
q.push(make_pair(ny, nx));
}
}
}
}
while(!q.empty()){
int y = q.front().first;
int x = q.front().second;
q.pop();
for(int i=0;i<4;i++){
int ny = y+dir[i].first;
int nx = x+dir[i].second;
if(ny<0||ny>=R||nx<0||nx>=C) continue;
if(!melted[ny][nx]){
melted[ny][nx] = true;
cache[ny][nx] = cache[y][x] + 1;
q.push(make_pair(ny, nx));
}
}
}
}
void moveTheBirds(){
while(!bq.empty()){
Bird b = bq.top().second;
answer = max(-bq.top().first, answer);
bq.pop();
// cout<<b.y<<" "<<b.x<<'\n';
if(b.y==dest.first && b.x==dest.second){
cout<<answer<<'\n';
return;
}
for(int i=0;i<4;i++){
int ny = b.y+dir[i].first;
int nx = b.x+dir[i].second;
if(ny<0||ny>=R||nx<0||nx>=C) continue;
if(visited[ny][nx]) continue;
visited[ny][nx] = true;
Bird nb;
nb.y=ny;
nb.x=nx;
bq.push(make_pair(-cache[ny][nx], nb));
}
}
}
int main() {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
input();
melting();
moveTheBirds();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgQmlyZHsKCWludCB5LCB4Owp9OwoKc3RydWN0IENvbXBhcmV7CiAgICBib29sIG9wZXJhdG9yKCkocGFpcjxpbnQsIEJpcmQ+IHAxLCBwYWlyPGludCwgQmlyZD4gcDIpIHsKICAgICAgICByZXR1cm4gcDEuZmlyc3QgPCBwMi5maXJzdDsKICAgIH0KfTsKCnBhaXI8aW50LCBpbnQ+IGRpcls0XSA9IHsKCW1ha2VfcGFpcigtMSwgMCksIG1ha2VfcGFpcigxLCAwKSwgbWFrZV9wYWlyKDAsIC0xKSwgbWFrZV9wYWlyKDAsIDEpCn07CmludCBpZCA9IDE7CmludCBSLCBDOwpwYWlyPGludCwgaW50PiBkZXN0OwppbnQgYW5zd2VyID0gLTE7CmNoYXIgbWFwWzE1MDBdWzE1MDBdID0gezAsfTsKYm9vbCB2aXNpdGVkWzE1MDBdWzE1MDBdID0ge2ZhbHNlLCB9OwppbnQgbWVsdGVkWzE1MDBdWzE1MDBdID0ge2ZhbHNlLCB9OwppbnQgY2FjaGVbMTUwMF1bMTUwMF0gPSB7ZmFsc2UsIH07CnByaW9yaXR5X3F1ZXVlPHBhaXI8aW50LCBCaXJkPiwgdmVjdG9yPHBhaXI8aW50LCBCaXJkPj4sIENvbXBhcmU+IGJxOyAKCnZvaWQgaW5wdXQoKXsKCWNpbj4+Uj4+QzsKCglmb3IoaW50IGk9MDtpPFI7aSsrKXsKCQlmb3IoaW50IGo9MDtqPEM7aisrKXsKCQkJY2luPj5tYXBbaV1bal07CgkJCgkJCWlmKG1hcFtpXVtqXSE9J1gnKSBtZWx0ZWRbaV1bal0gPSB0cnVlOwoJCQlpZihtYXBbaV1bal09PSdMJyl7CgkJCQlpZihpZD09MSl7CgkJCQkJQmlyZCBiOwoJCQkJCWIueT1pOwoJCQkJCWIueD1qOwoJCQkJCWlkPS0xOwoJCQkJCWJxLnB1c2gobWFrZV9wYWlyKDAsIGIpKTsKCQkJCQl2aXNpdGVkW2IueV1bYi54XT10cnVlOwoJCQkJfWVsc2V7CgkJCQkJZGVzdD1tYWtlX3BhaXIoaSwgaik7CgkJCQl9CgkJCX0KCQl9Cgl9Cn0KCnZvaWQgbWVsdGluZygpewoJcXVldWU8cGFpcjxpbnQsIGludD4+IHE7CgkKCWZvcihpbnQgeT0wO3k8Ujt5KyspewoJCWZvcihpbnQgeD0wO3g8Qzt4KyspewoJCQlpZihtYXBbeV1beF09PSdYJykgY29udGludWU7CgkJCWZvcihpbnQgaT0wO2k8NDtpKyspewoJCQkJaW50IG55ID0geStkaXJbaV0uZmlyc3Q7CgkJCQlpbnQgbnggPSB4K2RpcltpXS5zZWNvbmQ7CgkJCQkKCQkJCWlmKG1lbHRlZFtueV1bbnhdKSBjb250aW51ZTsKCQkJCWlmKG55PDB8fG55Pj1SfHxueDwwfHxueD49QykgY29udGludWU7CgkJCQlpZihtYXBbbnldW254XT09J1gnKXsKCQkJCQltZWx0ZWRbbnldW254XSA9IHRydWU7CgkJCQkJY2FjaGVbbnldW254XSA9IGNhY2hlW3ldW3hdICsgMTsKCQkJCQlxLnB1c2gobWFrZV9wYWlyKG55LCBueCkpOwoJCQkJfSAKCQkJfQoJCX0KCX0KCQoJd2hpbGUoIXEuZW1wdHkoKSl7CgkJaW50IHkgPSBxLmZyb250KCkuZmlyc3Q7CgkJaW50IHggPSBxLmZyb250KCkuc2Vjb25kOwoJCXEucG9wKCk7CgkJCgkJZm9yKGludCBpPTA7aTw0O2krKyl7CgkJCWludCBueSA9IHkrZGlyW2ldLmZpcnN0OwoJCQlpbnQgbnggPSB4K2RpcltpXS5zZWNvbmQ7CgkJCWlmKG55PDB8fG55Pj1SfHxueDwwfHxueD49QykgY29udGludWU7CgkJCWlmKCFtZWx0ZWRbbnldW254XSl7CgkJCQltZWx0ZWRbbnldW254XSA9IHRydWU7CgkJCQljYWNoZVtueV1bbnhdID0gY2FjaGVbeV1beF0gKyAxOwoJCQkJcS5wdXNoKG1ha2VfcGFpcihueSwgbngpKTsKCQkJfQoJCX0KCX0KfQoKdm9pZCBtb3ZlVGhlQmlyZHMoKXsKCXdoaWxlKCFicS5lbXB0eSgpKXsKCQlCaXJkIGIgPSBicS50b3AoKS5zZWNvbmQ7CgkJYW5zd2VyID0gbWF4KC1icS50b3AoKS5maXJzdCwgYW5zd2VyKTsKCQlicS5wb3AoKTsKCQkvLyBjb3V0PDxiLnk8PCIgIjw8Yi54PDwnXG4nOwoJCWlmKGIueT09ZGVzdC5maXJzdCAmJiBiLng9PWRlc3Quc2Vjb25kKXsKCQkJY291dDw8YW5zd2VyPDwnXG4nOwoJCQlyZXR1cm47CgkJfQoJCQoJCWZvcihpbnQgaT0wO2k8NDtpKyspewoJCQlpbnQgbnkgPSBiLnkrZGlyW2ldLmZpcnN0OwoJCQlpbnQgbnggPSBiLngrZGlyW2ldLnNlY29uZDsKCQkJaWYobnk8MHx8bnk+PVJ8fG54PDB8fG54Pj1DKSBjb250aW51ZTsKCQkJaWYodmlzaXRlZFtueV1bbnhdKSBjb250aW51ZTsKCQkJdmlzaXRlZFtueV1bbnhdID0gdHJ1ZTsKCQkJQmlyZCBuYjsKCQkJbmIueT1ueTsKCQkJbmIueD1ueDsKCQkJYnEucHVzaChtYWtlX3BhaXIoLWNhY2hlW255XVtueF0sIG5iKSk7CgkJfQoJfQp9CgppbnQgbWFpbigpIHsKCWNpbi50aWUoMCk7Cgljb3V0LnRpZSgwKTsKCWlvczo6c3luY193aXRoX3N0ZGlvKDApOwoJCglpbnB1dCgpOwoJbWVsdGluZygpOwoJbW92ZVRoZUJpcmRzKCk7CgoJcmV0dXJuIDA7Cn0=
OCAxNwouLi5YWFhYWFguLlhYLlhYWAouLi4uWFhYWFhYWFhYLlhYWAouLi5YWFhYWFhYWFhYWFguLgouLlhYWFhYLkxYWFhYWFguLgouWFhYWFhYLi5YWFhYWFguLgpYWFhYWFhYLi4uWFhYWC4uLgouLlhYWFhYLi4uWFhYLi4uLgouLi4uWFhYWFguWFhYTC4uLg==
8 17
...XXXXXX..XX.XXX
....XXXXXXXXX.XXX
...XXXXXXXXXXXX..
..XXXXX.LXXXXXX..
.XXXXXX..XXXXXX..
XXXXXXX...XXXX...
..XXXXX...XXX....
....XXXXX.XXXL...