#include <iostream>
#include <queue>
using namespace std;
using pii = pair<int, int>;
using pii_pii = pair<pii, pii>;
int dr[] = {-1, 0, 1, 0};
int dc[] = {0, 1, 0, -1};
int bfs(vector<string>& board, pii& src, pii& dst1, pii& dst2){
bool visited[51][51][5][4];
visited[src.first][src.second][4][0] = true;
queue<pair<pii_pii, int>> q;
q.push(make_pair(make_pair(make_pair(-1, 0), src), 0));
while(!q.empty()){
int dir = q.front().first.first.first;
int cnt = q.front().first.first.second;
auto now = q.front().first.second;
int bit = q.front().second;
q.pop();
if(bit == 3){
return cnt;
}
for(int i = 0; i < 4; i++){
int next_r = now.first + dr[i];
int next_c = now.second + dc[i];
auto next = make_pair(next_r, next_c);
int next_bit = bit | (next == dst1) | (2 * (next == dst2));
if(next_r < 0 or next_r >= board.size() or next_c < 0 or next_c >= board[0].size() or dir == i){
continue;
}
if(!visited[next_r][next_c][i][next_bit] and board[next_r][next_c] != '#'){
visited[next_r][next_c][i][next_bit] = true;
q.push(make_pair(make_pair(make_pair(i, cnt + 1), next), next_bit));
}
}
}
return -1;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int R, C;
cin >> R >> C;
vector<string> board(R);
pii src, dst[2];
int cnt = 0;
for(int i = 0; i < R; i++){
cin >> board[i];
for(int j = 0; j < C; j++){
if(board[i][j] == 'S'){
src.first = i;
src.second = j;
}else if(board[i][j] == 'C'){
dst[cnt].first = i;
dst[cnt++].second = j;
}
}
}
cout << bfs(board, src, dst[0], dst[1]);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBwaWkgPSBwYWlyPGludCwgaW50PjsKdXNpbmcgcGlpX3BpaSA9IHBhaXI8cGlpLCBwaWk+OwoKaW50IGRyW10gPSB7LTEsIDAsIDEsIDB9OwppbnQgZGNbXSA9IHswLCAxLCAwLCAtMX07CgppbnQgYmZzKHZlY3RvcjxzdHJpbmc+JiBib2FyZCwgcGlpJiBzcmMsIHBpaSYgZHN0MSwgcGlpJiBkc3QyKXsKCQoJYm9vbCB2aXNpdGVkWzUxXVs1MV1bNV1bNF07Cgl2aXNpdGVkW3NyYy5maXJzdF1bc3JjLnNlY29uZF1bNF1bMF0gPSB0cnVlOwoJCglxdWV1ZTxwYWlyPHBpaV9waWksIGludD4+IHE7CglxLnB1c2gobWFrZV9wYWlyKG1ha2VfcGFpcihtYWtlX3BhaXIoLTEsIDApLCBzcmMpLCAwKSk7CgkKCXdoaWxlKCFxLmVtcHR5KCkpewoKCQlpbnQgZGlyID0gcS5mcm9udCgpLmZpcnN0LmZpcnN0LmZpcnN0OwoJCWludCBjbnQgPSBxLmZyb250KCkuZmlyc3QuZmlyc3Quc2Vjb25kOwoJCWF1dG8gbm93ID0gcS5mcm9udCgpLmZpcnN0LnNlY29uZDsKCQlpbnQgYml0ID0gcS5mcm9udCgpLnNlY29uZDsKCQlxLnBvcCgpOwoJCQoJCWlmKGJpdCA9PSAzKXsKCQkJcmV0dXJuIGNudDsKCQl9CgoJCWZvcihpbnQgaSA9IDA7IGkgPCA0OyBpKyspewoJCQlpbnQgbmV4dF9yID0gbm93LmZpcnN0ICsgZHJbaV07CgkJCWludCBuZXh0X2MgPSBub3cuc2Vjb25kICsgZGNbaV07CgkJCWF1dG8gbmV4dCA9IG1ha2VfcGFpcihuZXh0X3IsIG5leHRfYyk7CgkJCWludCBuZXh0X2JpdCA9IGJpdCB8IChuZXh0ID09IGRzdDEpIHwgKDIgKiAobmV4dCA9PSBkc3QyKSk7CgkJCWlmKG5leHRfciA8IDAgb3IgbmV4dF9yID49IGJvYXJkLnNpemUoKSBvciBuZXh0X2MgPCAwIG9yIG5leHRfYyA+PSBib2FyZFswXS5zaXplKCkgb3IgZGlyID09IGkpewoJCQkJY29udGludWU7CgkJCX0KCQkJaWYoIXZpc2l0ZWRbbmV4dF9yXVtuZXh0X2NdW2ldW25leHRfYml0XSBhbmQgYm9hcmRbbmV4dF9yXVtuZXh0X2NdICE9ICcjJyl7CgkJCQl2aXNpdGVkW25leHRfcl1bbmV4dF9jXVtpXVtuZXh0X2JpdF0gPSB0cnVlOwoJCQkJcS5wdXNoKG1ha2VfcGFpcihtYWtlX3BhaXIobWFrZV9wYWlyKGksIGNudCArIDEpLCBuZXh0KSwgbmV4dF9iaXQpKTsKCQkJfQoJCX0KCX0KCQoJcmV0dXJuIC0xOwp9CgppbnQgbWFpbigpIHsKCQoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKCWNpbi50aWUoMCk7CgkKCWludCBSLCBDOwoJY2luID4+IFIgPj4gQzsKCQoJdmVjdG9yPHN0cmluZz4gYm9hcmQoUik7CgkKCXBpaSBzcmMsIGRzdFsyXTsKCWludCBjbnQgPSAwOwoJCglmb3IoaW50IGkgPSAwOyBpIDwgUjsgaSsrKXsKCQljaW4gPj4gYm9hcmRbaV07CgkJZm9yKGludCBqID0gMDsgaiA8IEM7IGorKyl7CgkJCWlmKGJvYXJkW2ldW2pdID09ICdTJyl7CgkJCQlzcmMuZmlyc3QgPSBpOwoJCQkJc3JjLnNlY29uZCA9IGo7CgkJCX1lbHNlIGlmKGJvYXJkW2ldW2pdID09ICdDJyl7CgkJCQlkc3RbY250XS5maXJzdCA9IGk7CgkJCQlkc3RbY250KytdLnNlY29uZCA9IGo7CgkJCX0KCQl9Cgl9Cgljb3V0IDw8IGJmcyhib2FyZCwgc3JjLCBkc3RbMF0sIGRzdFsxXSk7CgkKCXJldHVybiAwOwp9