#include <fstream>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int NMAX = 1000;
const int nd = 4;
const int dx[nd] = {-1, 1, 0, 0};
const int dy[nd] = {0, 0, -1, 1};
int startx, starty, stopx, stopy;
int t[NMAX + 2][NMAX + 2], qx[NMAX * NMAX + 1], qy[NMAX * NMAX + 1];
int BFS(int dist)
{
for(int i = 1; i <= NMAX * NMAX; i++)
{
qx[i] = 0;
qy[i] = 0;
}
qx[1] = startx;
qy[1] = starty;
v[startx][starty] = 1;
int qb = 1, qe = 1;
while(qb <= qe)
{
int x = qx[qb], y = qy[qb];
qb++;
for(int i = 0; i < nd; i++)
{
int xn = x + dx[i], yn = y + dy[i];
if(v[xn][yn] == 0 && v[xn + dist][yn] != -2 && v[xn - dist][yn] != -2 && v[xn][yn + dist] != -2 && v[xn][yn - dist] != -2)
{
v[xn][yn] = v[x][y] + 1;
++qe;
qx[qe] = xn;
qy[qe] = yn;
}
}
}
return v[stopx][stopy];
}
int cautbin(int n)
{
int sol = 0, n2;
for(n2 = 1; n2 * 2 <= n; n2*=2)
{
}
for(int i = n2; i > 0; i/=2)
{
if(sol + i <= n && BFS(sol + i) != 0)
{
sol += i;
}
}
if(sol == 0)
{
return -1;
}
else
{
return sol;
}
}
int main()
{
int n, m;
fin >> n >> m;
string s;
getline(fin, s);
for(int i = 1; i <= n; ++i) {
getline(fin, s);
for(int j = 0; j < int(s.size()); ++j) {
if( s[j] == 'I' ) {
startx = i;
starty = j + 1;
}
if(s[j] == 'O') {
stopx = i;
stopy = j + 1;
}
if(s[j] == '*') {
t[i][j + 1] = -1;
}
if(s[j] == 'D') {
t[i][j + 1] = -2;
}
}
}
for(short i = 0; i <= n + 1; i++)
{
t[0][i] = NMAX*NMAX + 1;
t[n + 1][i] = NMAX*NMAX + 1;
t[i][0] = NMAX*NMAX + 1;
t[i][m + 1] = NMAX*NMAX + 1;
}
int dist = max(n, m) - 1;
fout << cautbin(dist) << "\n";
return 0;
}