#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
const int INF=1e6;
int dist[1005][1005],a[1005][1005],viz[1005][1005];
queue < pair<int,int> > q;
int dx[]={0,-1,0,1,0};
int dy[]={0,0,1,0,-1};
int sx,sy,ex,ey,r,c;
int isok(int val)
{
int ax,ay,i,j;
for(i=1;i<=r;++i)
for(j=1;j<=c;++j)
viz[i][j]=0;
if(dist[sx][sy]>=val)
q.push(make_pair(sx,sy));
while(!q.empty())
{
if(q.front().first==ex&&q.front().second==ey)
break;
for(i=1;i<=4;++i)
{
ax=q.front().first+dx[i];
ay=q.front().second+dy[i];
if(dist[ax][ay]>=val&&(ax>=1&&ax<=r)&&(ay>=1&&ay<=c)&&!viz[ax][ay]&&!a[ax][ay])
q.push(make_pair(ax,ay)),viz[ax][ay]=1;
}
viz[q.front().first][q.front().second]=1;
q.pop();
}
if(!q.empty())
{
while(!q.empty())
q.pop();
return 1;
}
return 0;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int i,j,ax,ay,val=0;
char ch;
scanf("%d %d\n",&r,&c);
for(i=1;i<=r;++i)
{
for(j=1;j<=c;++j)
{
scanf("%c",&ch);
dist[i][j]=INF;
if(ch=='I')sx=i,sy=j;
if(ch=='O')ex=i,ey=j;
if(ch=='*')a[i][j]=1;
if(ch=='D')a[i][j]=2,dist[i][j]=0,q.push(make_pair(i,j));
}
scanf("\n");
}
while(!q.empty())
{
for(i=1;i<=4;++i)
{
ax=q.front().first+dx[i];
ay=q.front().second+dy[i];
if(!a[ax][ay]&&(ax>=1&&ax<=r)&&(ay>=1&&ay<=c))
{
if(dist[q.front().first][q.front().second]+1<dist[ax][ay])
{
q.push(make_pair(ax,ay));
dist[ax][ay]=dist[q.front().first][q.front().second]+1;
val=max(val,dist[ax][ay]);
}
}
}
q.pop();
}
/*for(i=1;i<=r;++i)
{
for(j=1;j<=c;++j)
if(dist[i][j]!=INF)
printf("%2d ",dist[i][j]);
else
printf("-1 ");
printf("\n");
}*/
int st=1,dr=val,med,ans=0,ok;
while(st<dr)
{
med=(st+dr)/2;
if(med==st)
break;
ok=isok(med);
if(ok==1)
{
ans=max(ans,med);
st=med;
}
else
dr=med;
}
printf("\n%d",ans);
return 0;
}