#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
#define MAX 1000
struct celula {
int x, y;
};
void step(char m[MAX][MAX], char check[MAX][MAX], int R, int C, int x, int y, int newx, int newy);
void ver(char m[MAX][MAX], char check[MAX][MAX], int R, int C, int x, int y);
void peretificare(char m[MAX][MAX], int R, int C, int dist);
int main()
{
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int R, C, dist;
char m[MAX][MAX], check[MAX][MAX] = {0}; //0 = nevizitat, 1 = liber, 2 = perete/dragon
celula start, iesire;
fin >> R >> C;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
fin >> m[i][j];
if (m[i][j] == 'I') {
start.x = i;
start.y = j;
m[i][j] = '.';
} else if (m[i][j] == 'O') {
iesire.x = i;
iesire.y = j;
m[i][j] = '.';
}
}
}
check[start.x][start.y] = 1;
ver(m, check, R, C, start.x, start.y);
if (check[iesire.x][iesire.y] == 0) {
fout << -1;
return 0;
}
for (dist = 1; dist < MAX; dist++) {
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
check[i][j] = 0;
}
}
check[start.x][start.y] = 1;
peretificare(m, R, C, dist);
ver(m, check, R, C, start.x, start.y);
if (check[iesire.x][iesire.y] != 1) {
break;
}
}
fout << dist;
fin.close();
fout.close();
return 0;
}
void step(char m[MAX][MAX], char check[MAX][MAX], int R, int C, int x, int y, int newx, int newy) {
if (check[newx][newy] == 0) {
if (m[newx][newy] == 'D' || m[newx][newy] == '*') {
check[newx][newy] = 2;
} else {
check[newx][newy] = 1;
ver(m, check, R, C, newx, newy);
}
}
}
void ver(char m[MAX][MAX], char check[MAX][MAX], int R, int C, int x, int y) {
if (x < C - 1) {
step(m, check, R, C, x, y, x + 1, y);
}
if (y < R - 1) {
step(m, check, R, C, x, y, x, y + 1);
}
if (x >= 1) {
step(m, check, R, C, x, y, x - 1, y);
}
if (y >= 1) {
step(m, check, R, C, x, y, x, y - 1);
}
}
void peretificare(char m[MAX][MAX], int R, int C, int dist) {
for (int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
if (m[i][j] == 'D') {
int ki = i - dist, kj = j;
while (ki < i) {
if (ki >= 0 && kj <= C - 1 && m[ki][kj] == '.') {
m[ki][kj] = '*';
}
ki++;
kj++;
}
while (kj > j) {
if (ki <= R - 1 && kj <= C - 1 && m[ki][kj] == '.') {
m[ki][kj] = '*';
}
ki++;
kj--;
}
while (ki > i) {
if (ki <= R - 1 && kj >= 0 && m[ki][kj] == '.') {
m[ki][kj] = '*';
}
ki--;
kj--;
}
while (kj < j) {
if (ki >= 0 && kj >= 0 && m[ki][kj] == '.') {
m[ki][kj] = '*';
}
ki--;
kj++;
}
}
}
}
}