const dl:array[1..4]of integer=(-1,1,0,0);
dc:array[1..4]of integer=(0,0,1,-1);
type poz=record
x,y:longint;
end;
var n,m,i,j,p,u:longint;
c:char;
v,x:array[1..1000,1..1000]of longint;
s:array[1..1000000]of poz;
st,sf:poz;
procedure intoarcerea_dragonului_care_scuipa_flacari;
var d,lnou,cnou:longint;
begin
p:=1;
while p<=u do
begin
for d:=1 to 4 do
begin
lnou:=s[p].x+dl[d];
cnou:=s[p].y+dc[d];
if (lnou>0)and(lnou<=n)and(cnou>0)and(cnou<=m)and(v[lnou,cnou]=-2) then
begin
v[lnou,cnou]:=v[s[p].x,s[p].y]+1;
inc(u);
s[u].x:=lnou;
s[u].y:=cnou;
end;
end;
inc(p);
end;
end;
function posibil(d:longint):boolean;
var k,lnou,cnou:longint;
begin
posibil:=false;
fillchar(x,sizeof(x),0);
p:=1;
u:=1;
s[1]:=st;
x[s[1].x,s[1].y]:=1;
while p<=u do
begin
for k:=1 to 4 do
begin
lnou:=s[p].x+dl[k];
cnou:=s[p].y+dc[k];
if (lnou>0)and(lnou<=n)and(cnou>0)and(cnou<=m)and(v[lnou,cnou]>=d)and(x[lnou,cnou]=0) then
begin
inc(u);
s[u].x:=lnou;
s[u].y:=cnou;
x[lnou,cnou]:=1;
end;
end;
inc(p);
end;
if x[sf.x,sf.y]=1 then
posibil:=true;
end;
function cauta(ls,ld:longint):longint;
var front,middle,back,sol:longint;
begin
front:=ls;
back:=ld;
while front<=back do
begin
middle:=(front+back)div 2;
if posibil(middle) then
begin
front:=middle+1;
sol:=middle;
end
else
back:=middle-1;
end;
cauta:=sol;
end;
begin
assign(input,'barbar.in');reset(input);
assign(output,'barbar.out');rewrite(output);
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(c);
case c of
'.':v[i,j]:=-2;
'*':v[i,j]:=-1;
'D': begin
v[i,j]:=0;
inc(u);
s[u].x:=i;
s[u].y:=j;
end;
'I': begin
v[i,j]:=-2;
st.x:=i;
st.y:=j;
end;
'O': begin
v[i,j]:=-2;
sf.x:=i;
sf.y:=j;
end;
end;
end;
readln;
end;
intoarcerea_dragonului_care_scuipa_flacari;
writeln(cauta(-1,v[st.x,st.y]));
close(input);close(output);
end.