#include <cstdio>
#include <queue>
#include <cstring>
#define MAX 1111
#define GOL -2
#define POM -1
#define DRG 0
using namespace std;
struct lee{
int x,y;
};
lee start,finish;
inline lee build(int i,int j){
lee a;
a.x=i;
a.y=j;
return a;
}
queue <lee> coada;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int n,m;
int mat[MAX][MAX];
bool uz[MAX][MAX];
void citire();
void init_mat(int matrice[MAX][MAX],int n,int m,int q);
void bordez(int matrice[MAX][MAX],int n,int m);
void build_lee();
int cautarea_smechera_binara_a_lui_Petrascu();
bool inline check(int p);
void afis();
int main()
{
citire();
build_lee();
afis();
return 0;
}
void citire(){
char ch;
freopen("barbar.in","r",stdin);
scanf("%d%d\n",&n,&m);
init_mat(mat,n,m,GOL);
bordez(mat,n,m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
scanf("%c",&ch);
if (ch=='*')mat[i][j]=POM;
else if (ch=='.')mat[i][j]=GOL;
else if (ch=='D')mat[i][j]=DRG,coada.push(build(i,j));
else if (ch=='O')finish.x=i,finish.y=j;
else start.x=i,start.y=j;
}
scanf("%c",&ch);
}
}
void init_mat(int matrice[MAX][MAX],int n,int m,int q){
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
matrice[i][j]=q;
}
void bordez(int matrice[MAX][MAX],int n,int m){
for(int i=0;i<=n+1;i++)mat[i][0]=mat[i][m+1]=POM;
for(int j=0;j<=m+1;j++)mat[0][j]=mat[n+1][j]=POM;
}
void build_lee(){
int temp_x,temp_y;
while(!coada.empty()){
temp_x=coada.front().x;
temp_y=coada.front().y;
for(int i=0;i<=3;++i)
if(mat[temp_x+dx[i]][temp_y+dy[i]]==GOL){
mat[temp_x+dx[i]][temp_y+dy[i]]=mat[temp_x][temp_y]+1;
coada.push(build(temp_x+dx[i],temp_y+dy[i]));
}
coada.pop();
}
}
bool inline check(int p){
if(mat[start.x][start.y]==GOL)return 1;
if(mat[start.x][start.y]<p)return 0;
coada.push(start);
memset(uz,0,sizeof(uz));
uz[start.x][start.y]=1;
int temp_x,temp_y;
while(!coada.empty()){
temp_x=coada.front().x;
temp_y=coada.front().y;
for(int i=0;i<=3;++i)
if(mat[temp_x+dx[i]][temp_y+dy[i]]>=p and !uz[temp_x+dx[i]][temp_y+dy[i]]){
uz[temp_x+dx[i]][temp_y+dy[i]]=1;
coada.push(build(temp_x+dx[i],temp_y+dy[i]));
}
coada.pop();
}
return uz[finish.x][finish.y];
}
int cautarea_smechera_binara_a_lui_Petrascu(){
int i, step;
for (step=1;step<n*m; step <<= 1);
for (i=0;step;step>>= 1)
if (i+step<=n*m and check(i+step))
i += step;
if(!i)return -1;
return i;
}
void afis(){
freopen("barbar.out","w",stdout);
printf("%d\n",cautarea_smechera_binara_a_lui_Petrascu());
}