#include <bits/stdc++.h>
using namespace std;
struct timer {
  time_t start;
  timer() { start = clock(); }
  ~timer() {
    cerr << 1. * (clock() - start) / CLOCKS_PER_SEC << " secs" << endl;
  }
};
int n, m, K;
char c[55][55];
int sy, sx, ty, tx;
map<int, string> d[55][55];
int dy[] = {0, 1, 0, -1};
int dx[] = {1, 0, -1, 0};
string shortest[55][55];
int smask[55][55];
struct state {
  int y, x;
  string s;
  int mask;
  state(int y, int x, string s, int mask) : y(y), x(x), s(s), mask(mask) {}
};
const bool operator<(const state& a, const state& b) {
  return ((int)a.s.size()) > ((int)b.s.size()) ||
         ((int)a.s.size()) == ((int)b.s.size()) && a.s > b.s;
}
const bool better(string s, string t) {
  return ((int)s.size()) < ((int)t.size()) ||
         ((int)s.size()) == ((int)t.size()) && s < t;
}
int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cin >> n >> m >> K;
  for (int i = 1; i < (n + 1); i++)
    for (int j = 1; j < (m + 1); j++) {
      cin >> c[i][j];
      if (c[i][j] == 'S') sy = i, sx = j;
      if (c[i][j] == 'T') ty = i, tx = j;
    }
  for (int i = 1; i < (n + 1); i++)
    for (int j = 1; j < (m + 1); j++) {
      shortest[i][j] = string(n * m, '~');
    }
  d[sy][sx][0] = "";
  priority_queue<state> Q;
  Q.push(state(sy, sx, "", 0));
  while (((int)Q.size())) {
    state s = Q.top();
    Q.pop();
    if (s.y == ty && s.x == tx) {
      cout << s.s.substr(0, ((int)s.s.size()) - 1);
      return 0;
    }
    for (int i = 0; i < (4); i++) {
      int ny = s.y + dy[i], nx = s.x + dx[i];
      if (!c[ny][nx] || c[ny][nx] == 'S') continue;
      if (c[ny][nx] != 'T' && __builtin_popcount(s.mask) == K &&
          !(s.mask >> (c[ny][nx] - 'a') & 1))
        continue;
      string ndist = s.s + c[ny][nx];
      int nmask = s.mask | (c[ny][nx] == 'T' ? 0 : 1 << (c[ny][nx] - 'a'));
      if (!better(ndist, shortest[ny][nx]) &&
          (smask[ny][nx] & nmask) == smask[ny][nx])
        continue;
      if (shortest[ny][nx][0] == '~') {
        shortest[ny][nx] = ndist;
        smask[ny][nx] = nmask;
      }
      if (d[ny][nx].find(nmask) == d[ny][nx].end() ||
          better(ndist, d[ny][nx][nmask])) {
        d[ny][nx][nmask] = ndist;
        Q.push(state(ny, nx, ndist, nmask));
      }
    }
  }
  cout << -1;
}
