#include <fstream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <queue>
using namespace std;
#define llu long long unsigned
#define ll long long
#define pb push_back
#define mp make_pair
const int N = 1005;
char h[N][N];
int danger[N][N], xS, yS, xF, yF;
bool viz[N][N];
queue < pair<int, int> > q;
int d[4][2] = {
{-1, 0}, {1, 0}, {0, -1}, {0, 1}
};
void go(int i, int j, int xx){
int x, y, k;
viz[i][j] = 1;
for(k = 0;k < 4;k++){
x = i + d[k][0];
y = j + d[k][1];
if(h[x][y] != '*' && danger[x][y] >= xx && viz[x][y] == 0){
go(x, y, xx);
}
}
}
void reset(int n, int m){
int i,j;
for(i = 1;i <= n;i++){
for(j = 1;j <= m;j++){
viz[i][j] = 0;
}
}
}
int main(){
int n, m, i, j, x, y, nx, ny;
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
scanf("%d %d", &n, &m);
for(i = 1;i <= n;i++){
scanf("%s", h[i]+1);
}
for(i = 0;i <= n+1;i++){
h[i][0] = h[i][m+1] = '*';
}
for(i = 0;i <= m+1;i++){
h[0][i] = h[n+1][i] = '*';
}
for(i = 1;i <= n;i++){
for(j = 1;j <= m;j++){
danger[i][j] = -1;
if(h[i][j] == 'D'){
q.push({i, j});
danger[i][j] = 0;
}else if(h[i][j] == 'I'){
xS = i;
yS = j;
}else if(h[i][j] == 'O'){
xF = i;
yF = j;
}
}
}
while(q.empty() == false){
x = q.front().first;
y = q.front().second;
q.pop();
for(i = 0;i < 4;i++){
nx = x + d[i][0];
ny = y + d[i][1];
if(danger[nx][ny] == -1 && h[nx][ny] != '*'){
danger[nx][ny] = danger[x][y] + 1;
q.push({nx, ny});
}
}
}
int mx = -1;
int lf,mid,rg;
lf = 1;
rg = n+m+1;
while(lf <= rg){
mid = (lf+rg)/2;
if(danger[xS][yS] >= mid){
go(xS, yS, mid);
}
if(viz[xF][yF] == 1){
mx = mid;
lf = mid+1;
}else{
rg = mid-1;
}
reset(n, m);
}
printf("%d",mx);
return 0;
}