#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using pll = pair<ll, ll>;
using vl = vector<ll>;
using vll = vector<vl>;
using vpll = vector<pll>;
const ld PI = 3.1415926535897932;
void in() {}
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head h, Tail... t) {
  cerr << " " << h;
  if (sizeof...(t) > 0) cerr << " :";
  debug_out(t...);
}
template <typename T>
ostream& operator<<(ostream& os, vector<T> vec) {
  for (size_t i = 0; i < vec.size(); i++)
    os << vec[i] << (i + 1 == vec.size() ? "" : " ");
  return os;
}
ll ctoi(char c) {
  switch (c) {
    case '0':
      return 0;
    case '1':
      return 1;
    case '2':
      return 2;
    case '3':
      return 3;
    case '4':
      return 4;
    case '5':
      return 5;
    case '6':
      return 6;
    case '7':
      return 7;
    case '8':
      return 8;
    case '9':
      return 9;
    default:
      return 0;
  }
}
bool pairCompare(const pll firstElof, pll secondElof) {
  return firstElof.first > secondElof.first;
}
ll i, j, k, l;
ll N, M, K, H, W, L, X, Y, Z, R, Q;
ll MOD = 1000000007;
ll INF = 1LL << 60;
ll ans = 0;
ll z = 0, o = 1;
vl flag;
vll D;
vll path;
vector<string> A;
ll magic = 0;
queue<pll> list;
void bfs(ll h, ll w, ll count) {
  queue<tuple<ll, ll, ll>> Q;
  Q.push(make_tuple(h, w, 0));
  D[h][w] = 1;
  tuple<ll, ll, ll> u;
  while (!Q.empty()) {
    u = Q.front();
    Q.pop();
    ll p = get<0>(u);
    ll q = get<1>(u);
    ll c = get<2>(u);
    if (ans == 1 || c == K) {
      list.push(make_pair(p, q));
    }
    if (p == 0 || p == H - 1 || q == 0 || q == W - 1) {
      cout << ans;
      exit(0);
    } else if (c < K) {
      ll np, nq;
      np = p + 1;
      nq = q;
      if ((ans > 1 || A[np][nq] == '.') && !D[np][nq]) {
        Q.push(make_tuple(np, nq, c + 1));
        D[np][nq] = 1;
      }
      np = p - 1;
      nq = q;
      if ((ans > 1 || A[np][nq] == '.') && !D[np][nq]) {
        Q.push(make_tuple(np, nq, c + 1));
        D[np][nq] = 1;
      }
      np = p;
      nq = q + 1;
      if ((ans > 1 || A[np][nq] == '.') && !D[np][nq]) {
        Q.push(make_tuple(np, nq, c + 1));
        D[np][nq] = 1;
      }
      np = p;
      nq = q - 1;
      if ((ans > 1 || A[np][nq] == '.') && !D[np][nq]) {
        Q.push(make_tuple(np, nq, c + 1));
        D[np][nq] = 1;
      }
    }
  }
}
int main() {
  cin >> H >> W >> K;
  A.resize(H);
  D.resize(H);
  ll sh = 0, sw = 0;
  for (i = 0; i < H; i++) {
    cin >> A[i];
    for (j = 0; j < W; j++) {
      D[i].push_back(0);
      if (A[i][j] == 'S') {
        sh = i;
        sw = j;
      }
    }
  }
  list.push(make_pair(sh, sw));
  while (true) {
    ans++;
    ll L = list.size();
    for (ll i = 0; i < L; i++) {
      pll p = list.front();
      list.pop();
      bfs(p.first, p.second, 0);
    }
  }
}
