#include <bits/stdc++.h>
#define pii pair<int, int>
#define fi first
#define se second
using namespace std;
const int N = 505;
const int INF = 1e9 + 7;
const int dx[4] = {-1, 0, 0, 1};
const int dy[4] = {0, -1, 1, 0};
int n, m, K, ans;
int dis[70][N][N];
char c[N][N];
bool mark[70];
vector<pii> v;
vector<pair<int, pii>> Q;
bool check(int x, int y){
return 0 < x && x <= n && 0 < y && y <= m && c[x][y] != '#';
}
void BFS(int k){
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
dis[k][i][j] = INF;
dis[k][v[k].fi][v[k].se] = 0;
queue<pii> q;
q.push({v[k].fi, v[k].se});
while (!q.empty()){
int x = q.front().fi, y = q.front().se; q.pop();
for (int i = 0; i < 4; ++i){
int nx = x + dx[i], ny = y + dy[i];
if (check(nx, ny) && dis[k][nx][ny] == INF)
dis[k][nx][ny] = dis[k][x][y] + 1,
q.push({nx, ny});
}
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n >> m >> K;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j) {
cin >> c[i][j];
if (c[i][j] == 'S' || c[i][j] == 'X') v.push_back({i, j});
if (c[i][j] == 'S') swap(v.back(), v[0]);
}
for (int i = 0; i <= K; ++i)
BFS(i);
for (int i = 1; i <= K; ++i)
if (dis[0][v[i].fi][v[i].se] == INF)
return cout << -1, 0;
for (int i = 1; i < K; ++i)
for (int j = i + 1; j <= K; ++j)
if (dis[j][v[i].fi][v[i].se] < dis[0][v[i].fi][v[i].se] + dis[0][v[j].fi][v[j].se])
Q.push_back({dis[j][v[i].fi][v[i].se] + dis[0][v[i].fi][v[i].se] + dis[0][v[j].fi][v[j].se], {i, j}});
// for (int x = 0; x <= K; ++x){
// cout << "\n";
// for (int i = 1; i <= n; ++i){
// for (int j = 1; j <= m; ++j) cout << dis[x][i][j] << " "; cout << "\n";
// }
// }
sort(Q.begin(), Q.end());
for (pair<int, pii> x: Q)
if (!mark[x.se.fi] && !mark[x.se.se])
ans += x.fi, mark[x.se.fi] = mark[x.se.se] = 1;//, cout << v[x.se.fi].fi << " " << v[x.se.fi].se << "\t" << v[x.se.se].fi << " " << v[x.se.se].se << "\n";
for (int i = 1; i <= K; ++i)
if (!mark[i])
ans += (dis[0][v[i].fi][v[i].se] << 1);
cout << ans;
}