#include <stdio.h>
#include <string.h>
#define dim 1002
const int dx[]={0, 1, 0, -1}, dy[]={1, 0, -1, 0};
int r, c, a[dim][dim], xi, yi, xf, yf, b[dim][dim], fol[dim][dim];
int x[dim*dim], y[dim*dim], st=1, end=0;
char s[dim];
int min(const int &a, const int &b) {
return a>b?b:a;
}
void bf() {
int xx, yy, i;
while (st<=end) {
for (i=0; i<4; ++i) {
xx=x[st]+dx[i];
yy=y[st]+dy[i];
if (xx && xx<=r && yy && yy<=c && !b[xx][yy] && a[xx][yy]!=1 && a[xx][yy]!=-1) {
b[xx][yy]=b[x[st]][y[st]]+1;
x[++end]=xx, y[end]=yy;
}
}
st++;
}
}
int bf2(int val) {
int xx, yy, i;
memset(fol, 0, sizeof(fol));
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
memset(y, 0, sizeof(y));
st=end=0;
x[0]=xi, y[0]=yi;
fol[xi][yi]=1;
while (st<=end) {
for (i=0; i<4; ++i) {
xx=x[st]+dx[i];
yy=y[st]+dy[i];
if (xx && xx<=r && yy && yy<=c && a[xx][yy]!=1 && a[xx][yy]!=-1 && !fol[xx][yy] && b[xx][yy]>=val) {
fol[xx][yy]=1;
x[++end]=xx, y[end]=yy;
if (xx==xf && yy==yf) return 1;
}
}
st++;
}
return 0;
}
int main() {
int i, j, pr, ul, sol, m;
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
scanf("%d %d\n", &r, &c);
for (i=1; i<=r; ++i) {
scanf("%s\n", s);
for (j=1; j<=c; ++j)
if (s[j-1]=='.') a[i][j]=0;
else if (s[j-1]=='*') a[i][j]=-1;
else if (s[j-1]=='D') a[i][j]=1, x[++end]=i, y[end]=j;
else if (s[j-1]=='I') a[i][j]=0, xi=i, yi=j;
else a[i][j]=0, xf=i, yf=j;
}
bf();
pr=1, ul=min(b[xi][yi], b[xf][yf]);
while (pr<=ul) {
m=(st+ul)/2;
if (bf2(m)) sol=m, pr=m+1;
else ul=m-1;
}
printf("%d\n", sol);
return 0;
}