#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int>a[2000010];
char c[1010][1010];
int qi[1010][1010][4];
inline int ziped ( int x, int y ) {
return x * 1001 + y;
}
inline int unzip_x ( int zip ) {
return zip / 1001;
}
inline int unzip_y ( int zip ) {
return zip % 1001;
}
inline void p ( int t, int x, int y ) {
if ( x <= n && x && y && y <= m ) a[t].push_back ( ziped ( x, y ) );
}
int main() {
cin >> n >> m;
int sx, sy, cx, cy;
for ( int i = 1; i <= n; ++i )
for ( int j = 1; j <= m; ++j ) {
cin >> c[i][j];
if ( c[i][j] == 'S' ) sx = i, sy = j;
else if ( c[i][j] == 'C' ) cx = i, cy = j;
}
for ( int i = 1; i <= n; ++i )
for ( int j = 1; j <= m; ++j ) {
if ( c[i][j] == '#' ) {
int t = ziped ( i, j );
qi[i][j][0] = t;
qi[i][j][1] = t;
qi[i][j][2] = t;
qi[i][j][3] = t;
} else {
qi[i][j][0] = qi[i - 1][j][0];
qi[i][j][0] = qi[i + 1][j][0];
qi[i][j][0] = qi[i][j - 1][0];
qi[i][j][0] = qi[i][j + 1][0];
}
}
for ( int i = 1; i <= n; ++i )
for ( int j = 1; j <= m; ++j ) {
int z = ziped ( i, j );
p ( z, i, j + 1 );
p ( z, i, j - 1 );
p ( z, i + 1, j );
p ( z, i - 1, j );
for ( int k = 0; k < 4; ++k ) p ( qi[i][j][k ^ 1], unzip_x ( qi[i][j][k] ), unzip_y ( qi[i][j][k] ) );
}
queue< pair<int, int> >q;
q.push ( make_pair ( 0, ziped ( sx, sy ) ) );
int ans = ziped ( cx, cy );
while ( q.size() ) {
int step = q.front().first;
int hao = q.front().second;
q.pop();
if ( hao == ans ) {
cout << step;
return 0;
}
for(int i :a[hao]) {
q.push(make_pair(step+1,i));
}
}
return 0;
}