#include <iostream>
#include<fstream>
#include<queue>
#include<cstring>
using namespace std;ifstream fin("barbar.in");ofstream fout("barbar.out");struct cord{int x,y;};int n,m,v[1002][1002],lee[1001][1001],j,i,d,x1,y1,x2,y2,x,y,x0,y0,dirx[]={-1,0,1,0},diry[]={0,1,0,-1},st=1,dr,mij,rsp=-1;char k;queue<cord>q,emp;cord drg[1000001];
int main()
{fin>>n>>m;for(i=0;i<=n+1;i++)v[i][0]=v[i][m+1]=-1;for(i=1;i<=m;i++)v[0][i]=v[n+1][i]=-1;
for(i=1;i<=n;i++)for(j=1;j<=m;j++){fin>>k;if(k=='.')v[i][j]=0;else if(k=='*')v[i][j]=-1;else if(k=='D')drg[++d]={i,j},q.push({i,j});else if(k=='I')x1=i,y1=j;else x2=i,y2=j;}
while(!q.empty()){x=q.front().x;y=q.front().y;q.pop();for(i=0;i<4;i++){x0=x+dirx[i];y0=y+diry[i];if(!v[x0][y0]){v[x0][y0]=v[x][y]+1;q.push({x0,y0});}}}
for(i=1;i<=d;i++)v[drg[i].x][drg[i].y]=-1;dr=min(v[x1][y1],v[x2][y2]);while(st<=dr){mij=(st+dr)/2;memset(lee,0,sizeof(lee));q.push({x1,y1});while(!q.empty()&&lee[x2][y2]==0){x=q.front().x;y=q.front().y;q.pop();
for(i=0;i<4;i++){x0=x+dirx[i];y0=y+diry[i];if(mij<=v[x0][y0]&&lee[x0][y0]==0){lee[x0][y0]=lee[x][y]+1;q.push({x0,y0});}}}
if(lee[x2][y2])st=mij+1,rsp=mij;else dr=mij-1;q=emp;}fout<<rsp;
return 0;
}