#include <cstdio>
#include <queue>
#include <cstring>


using namespace std;

typedef pair< int, int > par;
#define x first
#define y second

const int MaxN = 505;

int dx[] = { 1, 0, -1, 0 };
int dy[] = { 0, 1, 0, -1 };

char a[ MaxN ][ MaxN ];
int h[ MaxN ][ MaxN ];
int bio[ MaxN ][ MaxN ];
int cookie, sx, sy, tx, ty, n, m;

queue< par > Q;

inline int valid( int x, int y ) { return x >= 0 && x < n && y >= 0 && y < m; }

int can( int c ) {
  while( !Q.empty() ) Q.pop();
  
  Q.push( par( sx, sy ) );
  bio[sx][sy] = ++cookie;
  while( !Q.empty() ) {
    int x = Q.front().x, y = Q.front().y;
    Q.pop();
    if( x == tx && y == ty ) return 1;
    
    for( int i = 0; i < 4; ++i ) {
      int X = x+dx[i], Y = y+dy[i];
      if( !valid( X, Y ) || bio[X][Y] == cookie || h[X][Y] < c ) continue;
      bio[X][Y] = cookie;
      Q.push( par( X, Y ) );
    }
  }
  return 0;
}

int main( void ) {
  memset( h, -1, sizeof( h ) );

  scanf( "%d %d", &n, &m );
  for( int i = 0; i < n; ++i ) {
    scanf( "%s", a[i] );
    for( int j = 0; j < m; ++j )
      if( a[i][j] == 'V' ) sx = i, sy = j; else
	if( a[i][j] == 'J' ) tx = i, ty = j; else
	  if( a[i][j] == '+' ) { h[i][j] = 0; Q.push( par( i, j ) ); }
  }

  while( !Q.empty() ) {
    int x = Q.front().x, y = Q.front().y;
    Q.pop();
    for( int i = 0; i < 4; ++i ) {
      int X = x+dx[i], Y = y+dy[i];
      if( !valid( X, Y ) || h[X][Y] != -1 ) continue;
      h[X][Y] = h[x][y]+1;
      Q.push( par( X, Y ) );
    }
  }

  int lo = 0, hi = h[sx][sy];
  while( lo < hi ) {
    int mid = ( lo+hi+1 )/2;
    if( can( mid ) ) lo = mid; else
      hi = mid-1;
  }
  printf( "%d\n", lo );
  return 0;
}
			  
