#include <cstdio>
#define min(a,b) (a<b)?a:b
#define max(a,b) (a>b)?a:b
#define INF 2000000000
#define NMAX 1002
using namespace std;
int solutie=-1,ul,Min,solpoz,st,n,m,ic,il,x,y,sol=INF,t[NMAX][NMAX],d[NMAX][NMAX];
char s[NMAX][NMAX];bool ok[NMAX][NMAX];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
struct coada{
int l,c;
}q[1000002],z;
void lee(){
st=1;
while(st<=ul){
z=q[st++];
for(short k=0;k<4;++k){
short l=z.l+dx[k],c=z.c+dy[k];
if(l>=0&&l<n&&c>=0&&c<m&&s[l][c]!='*'&&t[z.l][z.c]+1<t[l][c]){
t[l][c]=t[z.l][z.c]+1;
q[++ul].l=l,q[ul].c=c;
}
}
}
}
void lee2(short l1,short c1)
{
st=1,ul=1;d[l1][c1]=t[l1][c1];
q[st].l=l1,q[ul].c=c1;
while(st<=ul){
z=q[st++];sol=d[z.l][z.c];
for(short k=0;k<4;++k){
short l=z.l+dx[k],c=z.c+dy[k];
if(l>=0&&l<n&&c>=0&&c<m&&s[l][c]!='*'){
int aux=sol;
sol=min(sol,t[l][c]);
if(sol>d[l][c]){
q[++ul].l=l,q[ul].c=c;
d[l][c]=sol;
if(l==x&&c==y)
solutie=max(solutie,sol);
}sol=aux;
}
}
}
}
int main()
{
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i=0;i<n;++i)
scanf("%s", s[i]);
for(int i=0;i<n;++i)
for(int j=0;j<m;++j){
t[i][j]=INF;d[i][j]=-1;
if(s[i][j]=='I')ic=j,il=i;
else if(s[i][j]=='O') x=i,y=j;
else if(s[i][j]=='D')
{q[++ul].l=i,q[ul].c=j;t[i][j]=0;}
}
lee();
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
if(t[i][j]==INF) t[i][j]=-1;
d[il][ic]=t[il][ic];lee2(il,ic);
printf("%d\n", solutie);
// for(int i=0;i<n;++i){
// for(int j=0;j<m;++j)
// printf("%d ",t[i][j]);
// printf("\n");
// }
return 0;
}