#include <bits/stdc++.h>
using namespace std;
#define FOR(i,k,n) for(int i = (int)(k); i < (int)(n); i++)
#define REP(i,n) FOR(i,0,n)
#define ALL(a) a.begin(), a.end()
#define MS(m,v) memset(m,v,sizeof(m))
#define D10 fixed<<setprecision(10)
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<string> vs;
typedef pair<int, int> pii;
const int MOD = 1000000007;
const int INF = MOD + 1;
const ld EPS = 1e-12;
template<class T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template<class T> T &chmax(T &a, const T &b) { return a = max(a, b); }

/*--------------------template--------------------*/

const int dx[] = { -1, 0, 0, 1 }, dy[] = { 0, -1, 1, 0 };
bool valid(int x, int y, int h, int w) { return (x >= 0 && y >= 0 && x < h&&y < w); }
int place(int x, int y, int w) { return w*x + y; }

bool ok[111][111][11][11][4];

struct Dat
{
	int x, y, p, q, dir;
};

bool update(Dat dat)
{
	if (ok[dat.x][dat.y][dat.p][dat.q][dat.dir]) return false;
	ok[dat.x][dat.y][dat.p][dat.q][dat.dir] = true;
	return true;
}

int main()
{
	cin.sync_with_stdio(false);
	MS(ok, false);
	int h, w, a; cin >> h >> w >> a;
	vs fld(h);
	REP(i, h) cin >> fld[i];
	queue<Dat> que;
	int sx, sy, gx, gy;
	REP(i, h)REP(j, w)
	{
		if (fld[i][j] == 'S')
		{
			sx = i, sy = j;
			fld[i][j] = '.';
			Dat tmp{ i,j,0,0,3 };
			update(tmp);
			que.push(tmp);
		}
		if(fld[i][j] == 'G')
		{ 
			fld[i][j] = '.';
			gx = i, gy = j;
		}
	}
	int ans = INF;
	while (que.size())
	{
		Dat t = que.front();
		que.pop();
		int x = t.x, y = t.y, p = t.p, q = t.q, dir = t.dir;
		if (x == gx&&y == gy)
		{
			chmin(ans, p + q);
			continue;
		}
		int nx = x + dx[dir], ny = y + dy[dir];
		if (!valid(nx, ny, h, w) || fld[nx][ny] == '#') continue;
		if (nx == sx && ny == sy)
		{
			if(dir == 0 || dir == 3) continue;
			int np, nq, ndir;
			np = p, nq = q, ndir = dir;
			Dat ndat{ nx,ny,np,nq,ndir };
			if (update(ndat)) que.push(ndat);
		}
		else
		{
			if (dir == 0)
			{
				int np, nq, ndir;
				np = p, nq = q, ndir = 0;
				Dat ndat{ nx,ny,np,nq,ndir };
				if (update(ndat)) que.push(ndat);
				Dat ndat2 = ndat;
				ndat2.p++;
				ndat2.dir = 1;
				if (ndat2.p <= a && update(ndat2)) que.push(ndat2);
				Dat ndat3 = ndat;
				ndat3.q++;
				ndat3.dir = 2;
				if (ndat3.q <= a && update(ndat3)) que.push(ndat3);
			}
			else if (dir == 1)
			{
				int np, nq, ndir;
				np = p, nq = q, ndir = 1;
				Dat ndat{ nx,ny,np,nq,ndir };
				if (update(ndat)) que.push(ndat);
				Dat ndat2 = ndat;
				ndat2.p++;
				ndat2.dir = 0;
				if (ndat2.p <= a && update(ndat2)) que.push(ndat2);
				Dat ndat3 = ndat;
				ndat3.q++;
				ndat3.dir = 3;
				if (ndat3.q <= a && update(ndat3)) que.push(ndat3);
			}
			else if (dir == 2)
			{
				int np, nq, ndir;
				np = p, nq = q, ndir = 2;
				Dat ndat{ nx,ny,np,nq,ndir };
				if (update(ndat)) que.push(ndat);
				Dat ndat2 = ndat;
				ndat2.p++;
				ndat2.dir = 3;
				if (ndat2.p <= a && update(ndat2)) que.push(ndat2);
				Dat ndat3 = ndat;
				ndat3.q++;
				ndat3.dir = 0;
				if (ndat3.q <= a && update(ndat3)) que.push(ndat3);
			}
			else
			{
				int np, nq, ndir;
				np = p, nq = q, ndir = 3;
				Dat ndat{ nx,ny,np,nq,ndir };
				if (update(ndat)) que.push(ndat);
				Dat ndat2 = ndat;
				ndat2.p++;
				ndat2.dir = 2;
				if (ndat2.p <= a && update(ndat2)) que.push(ndat2);
				Dat ndat3 = ndat;
				ndat3.q++;
				ndat3.dir = 1;
				if (ndat3.q <= a && update(ndat3)) que.push(ndat3);
			}
		}
	}
	if (ans == INF) ans = -1;
	cout << ans << endl;
	return 0;
}

Measured memory_bytes: 9144