#include<fstream>
using namespace std;
int n, m, p, u, mid, d, ii, jj, iv, jv, ii1, jj1, ii2, jj2, st, dr, i, j;
int a[1002][1002], b[1002][1002];
int c[2][1000003];
int di[4] = {-1, 1, 0, 0};
int dj[4] = {0, 0, -1, 1};
char s;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int main(){
fin>> n >> m;
p = 1;
for(i = 1; i <= n; i++){
for(j = 1; j <= m; j++){
fin>> s;
if(s == 'D'){
u++;
c[0][u] = i;
c[1][u] = j;
b[i][j] = 1;
}
else{
if(s == 'I'){
ii1 = i;
jj1 = j;
}
else{
if(s == 'O'){
ii2 = i;
jj2 = j;
}
else{
if(s == '*'){
a[i][j] = b[i][j] = -1;
}
}
}
}
}
}
while(p <= u){
ii = c[0][p];
jj = c[1][p];
for(d = 0; d < 4; d++){
iv = ii + di[d];
jv = jj + dj[d];
if(iv >= 1 && iv <= n && jv >= 1 && jv <= m && b[iv][jv] == 0){
u++;
c[0][u] = iv;
c[1][u] = jv;
b[iv][jv] = b[ii][jj] + 1;
}
}
p++;
}
st = 1;
dr = min(b[ii1][jj1], b[ii2][jj2]) - 1;
while(st <= dr){
mid = (st + dr) / 2;
for(i = 1; i <= n; i++){
for(j = 1; j <= m; j++){
a[i][j] = 0;
}
}
p = u = 1;
a[ii1][jj1] = 1;
c[0][1] = ii1;
c[1][1] = jj1;
while(p <= u){
ii = c[0][p];
jj = c[1][p];
for(d = 0; d < 4; d++){
iv = ii + di[d];
jv = jj + dj[d];
if(iv >= 1 && iv <= n && jv >= 1 && jv <= m && b[iv][jv] > mid && a[iv][jv] == 0){
u++;
c[0][u] = iv;
c[1][u] = jv;
a[iv][jv] = a[ii][jj] + 1;
}
}
p++;
}
if(a[ii2][jj2] == 0){
dr = mid - 1;
}
else{
st = mid + 1;
}
}
if(dr < 1){
dr = -1;
}
fout<< dr <<"\n";
return 0;
}