#include <stdio.h>
#define DIM 1005
char A[DIM][DIM];
int viz[DIM][DIM];
int C[2][DIM*DIM], dist[DIM][DIM];
int di[] = {0, 0, -1, 1}, dj[] = {-1, 1, 0, 0};
int n, m, i, j, iv, jv, ip, jp, MAX, X1, X2, Y1, Y2, k, p, u, mj, sol;
FILE *f = fopen("barbar.in","r");
FILE *g = fopen("barbar.out","w");
void citeste() {
fscanf(f, "%d %d", &n, &m);
for (i = 1; i <= n; i++) {
fscanf(f, "\n");
for (j = 1; j <=m ; j++) {
fscanf(f, "%c", &A[i][j]);
if (A[i][j] == 'I')
X1 = i, Y1 = j;
if (A[i][j] == 'O')
X2 = i, Y2 = j;
if (A[i][j] == 'D') {
u++;
C[0][u] = i, C[1][u] = j;
viz[i][j] = 1;
}
}
}
}
void distante() {
for (p = 1; p <= u; p++) {
ip = C[0][p], jp = C[1][p];
for (k = 0; k < 4; k++) {
iv = ip + di[k];
jv = jp + dj[k];
if (A[iv][jv] != '*' && iv > 0 && iv <= n && jv > 0 && jv <= m) {
if (!viz[iv][jv]) {
u++;
C[0][u] = iv, C[1][u] = jv;
dist[iv][jv] = dist[ip][jp] + 1;
if (dist[iv][jv] > MAX)
MAX = dist[iv][jv];
viz[iv][jv] = 1;
}
else
if (dist[ip][jp] + 1 < dist[iv][jv])
dist[iv][jv] = dist[ip][jp] + 1;
}
}
}
}
void init() {
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
viz[i][j] = 0;
}
int drum(int MIN) {
int p, u;
init();
C[0][1] = X1, C[1][1] = Y1, viz[X1][Y1] = 1;
if (dist[X1][Y1] < MIN) return 0;
for (p = u = 1; p <= u; p++) {
ip = C[0][p], jp = C[1][p];
for (k = 0; k < 4; k++) {
iv = ip + di[k];
jv = jp + dj[k];
if (A[iv][jv] != '*' && dist[iv][jv] >= MIN && !viz[iv][jv] && iv > 0 && iv <= n && jv > 0 && jv <= m) {
u++;
C[0][u] = iv, C[1][u] = jv;
viz[iv][jv] = 1;
if (iv == X2 && jv == Y2)
return 1;
}
}
}
return 0;
}
int main() {
citeste();
distante();
sol = -1;
for (p = 0, u = MAX; p <= u; ) {
mj = (u - p) / 2 + p;
if ( drum(mj) ) {
sol = mj;
p = mj + 1;
}
else
u = mj - 1;
}
fprintf(g, "%d", sol);
fclose(f);
fclose(g);
return 0;
}