You already know that Valery's favorite sport is biathlon. Due to your help, he learned to shoot without missing, and his skills are unmatched at the shooting range. But now a smaller task is to be performed, he should learn to complete the path fastest.

The track's map is represented by a rectangle n × m in size divided into squares. Each square is marked with a lowercase Latin letter (which means the type of the plot), with the exception of the starting square (it is marked with a capital Latin letters S) and the terminating square (it is marked with a capital Latin letter T). The time of movement from one square to another is equal to 1 minute. The time of movement within the cell can be neglected. We can move from the cell only to side-adjacent ones, but it is forbidden to go beyond the map edges. Also the following restriction is imposed on the path: it is not allowed to visit more than k different types of squares (squares of one type can be visited an infinite number of times). Squares marked with S and T have no type, so they are not counted. But S must be visited exactly once — at the very beginning, and T must be visited exactly once — at the very end.

Your task is to find the path from the square S to the square T that takes minimum time. Among all shortest paths you should choose the lexicographically minimal one. When comparing paths you should lexicographically represent them as a sequence of characters, that is, of plot types.

Input

The first input line contains three integers n, m and k (1 ≤ n, m ≤ 50, n·m ≥ 2, 1 ≤ k ≤ 4). Then n lines contain the map. Each line has the length of exactly m characters and consists of lowercase Latin letters and characters S and T. It is guaranteed that the map contains exactly one character S and exactly one character T.

Pretest 12 is one of the maximal tests for this problem.

Output

If there is a path that satisfies the condition, print it as a sequence of letters — the plot types. Otherwise, print "-1" (without quotes). You shouldn't print the character S in the beginning and T in the end.

Note that this sequence may be empty. This case is present in pretests. You can just print nothing or print one "End of line"-character. Both will be accepted.

Examples

Input

5 3 2
Sba
ccc
aac
ccc
abT


Output

bcccc


Input

3 4 1
Sxyy
yxxx
yyyT


Output

xxxx


Input

1 3 3
TyS


Output

y


Input

1 4 1
SxyT


Output

-1
20 10 3
ebebccacdb
eeebccddeT
eadebecaac
adeeeaccbc
baccccdaed
deabceabba
dadbecbaaa
eacbbcedcb
aeeScdbbab
babaecaead
bacdbebeae
aacbadbeec
acddceecca
acaeaebaba
cdddeaaeae
eabddadade
ddddaeaeed
bccbaacadd
dccccbabdc
ecdaebeccc
 1 30 2
bmjcfldkloleiqqiTnmdjpaSckkijf
 15 15 3
cbbdccabdcbacbd
bcabdcacadacdbc
cbcddbbcdbddcad
ddcabdbbdcabbdc
aabadcccTcabdbb
cbacaaacaabdbbd
dbdcbSdabaadbdb
dbbaddcdddaadbb
bbddcdcbaccbbaa
adadadbdbbddccc
cddbbdaddcbbdcc
bbaadcdbbcaacca
adbdcdbbcbddbcd
cdadbcccddcdbda
cbcdaabdcabccbc
 10 8 2
bdcdcbfa
decffcce
dTffdacb
eeedcdbb
fdbbbcba
ddabfcda
abdbSeed
bdcdcffa
cadbaffa
fcccddad
 20 20 2
ddadfcdeTaeccbedeaec
acafdfdeaffdeabdcefe
abbcbefcdbbbcdebafef
fdafdcccbcdeeaedeffc
dfdaabdefdafabaabcef
febdcabacaaaabfacbbe
abfcaacadfdbfdbaaefd
dacceeccddccaccdbbce
cacebecabedbddfbfdad
dacbfcabbebfddcedffd
cfcdfacfadcfbcebebaa
ddfbebafaccbebeefbac
ebfaebacbbebdfcbcbea
dfbaebcfccacfeaccaad
edeedeceebcbfdbcdbbe
afaacccfbdecebfdabed
ddbdcedacedadeccaeec
ecbSeacbdcccbcedafef
cfdbeeffbeeafccfdddb
cefdbdfbabccfdaaadbf
 2 1 4
S
T
 3 5 2
SbcaT
acbab
acccb
 3 4 1
SbbT
aaaa
abba
 5 3 4
aaT
acc
bbb
bbc
cSb
 1 50 3
SaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaaaaaaaaaaa
 3 3 1
aaa
aaa
TSa
 6 6 3
pkhipk
mlfmak
aqmbae
dlbfSj
dpbjcr
aTbqbm
 3 4 1
Sbbb
aaaT
abbc
 5 5 1
caTbc
dccac
dacda
aacaS
cdcab
 1 40 1
faSfgfTcfadcdfagfbccbffbeaaebagbfcfcgdfd
 1 3 3
SaT
 1 10 2
baaSaaTacb
 20 20 2
baaaaaaaaaaaaaaaaaaa
bfffffffacfffffffffa
bgggggggaccgggggggga
bhhhhhhhaccchhhhhhha
biiiiiiiacccciiiiiia
bjjjjjjjacccccjjjjja
bkkkkkkkacccccckkkka
blllllllacccccccllla
bbbbbbbbSccccccccmma
bddddddddddcccccccna
bodddddddcccccccccca
bppddddddddTaaaaaaaa
bqqqdddddddbqqqqqqqa
brrrrddddddbrrrrrrra
bsssssdddddbsssssssa
bttttttddddbttttttta
buuuuuuudddbuuuuuuua
bvvvvvvvvddbvvvvvvva
bwwwwwwwwwdbwwwwwwwa
bbbbbbbbbbbbbbbbbbbb
 10 10 2
baaaaaaaaa
bffacffffa
bggaccggga
bbbSccchha
bdddddccia
bjddccccca
bkkdddTaaa
blllddblla
bmmmmdbmma
bbbbbbbbbb
 15 3 4
llv
ttT
hbo
ogc
kfe
gli
fbx
kfp
spm
cxc
ndw
Soa
pfh
edr
xmv
 3 4 2
Sbbb
aabT
abbc
 5 10 4
aaaaaaaaaa
aaaaaTaaaa
aaaaaaaSaa
aaaaaaaaaa
aaaaaaaaaa
 10 20 3
baaaaaaaaaaaaaaaaaaa
bfffffffacfffffffffa
bgggggggaccgggggggga
bbbbbbbbSccchhhhhhha
biiiiidddddcciiiiiia
bjjjjjjddcccccjjjjja
bkkkkkkkdddTaaaaaaaa
bllllllllddbllllllla
bmmmmmmmmmdbmmmmmmma
bbbbbbbbbbbbbbbbbbbb
 1 2 4
ST
 20 10 4
baaaaaaaaa
bffacffffa
bggaccggga
bhhaccchha
biiaccccia
bjjaccccca
bkkakkkkka
bllallllla
bbbSmmmmma
bnnnnnnnna
booooooooa
bpppppTaaa
bqqqqqbqqa
brrrrrbrra
bdddddbssa
btddddbtta
buudddbuua
bvvvddbvva
bwwwwdbwwa
bbbbbbbbbb
 15 10 4
sejwprqjku
pnjsiopxft
rsplgvwixq
endglkchxl
ftihbbexgh
sxtxbbavge
jcdkusfnmr
skgsqvflia
kcxmcxjpae
amaiwcfile
njgjSunmwd
ldxvahgreu
ecmrajbjuT
naioqigols
pbwrmxkltj
 4 5 3
abaaa
babaT
Sabba
aaaaa
 1 2 1
ST
 2 1 1
S
T
 1 20 3
acbccbbddbffScTadffd

bbbcccaccaac
 -1
 aaca
 bbbbee
 -1
 aacccaa
 bb
 bbbc
 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 cbqb
 aaa
 -1
 -1
 a
 aa
 ccccc
 ccccc
 -1
 aab
 aa
 ccccc
 mmmno
 aajbju
 aaba
 c

// amigos y no más
// dile a la jardinera que traigo flores
 
// += O(logn) ; + = O(n)
 
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
 
#define fastio ios_base::sync_with_stdio(0);cin.tie(0)
#define MOD 998244353LL
#define MOD1 1000000009LL
#define LIM 262150
#define FORN(i,j,n) for(int i=j; i<n;i++) 
#define FOR(i,n) FORN(i,0,n)
#define ones(x) __builtin_popcount(x)
#define MINIMO 0


using namespace std;
using namespace __gnu_pbds;
 
typedef long long ll ;
typedef unsigned long long ull ;
typedef tree<int,int,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;

int n,m,k;
char mat[55][55];
set< pair<int,int> > maskS;

int posSx,posSy,posTx,posTy;

int dx[] = {-1,0,+1,0};
int dy[] = {0,+1,0,-1};
string STRMAX = "";

struct elem{
	int x,y;
	string s;
	int mask;
	elem() {this->x=-1 ; this->y=-1; this->s=STRMAX; this->mask = 1<<28; } ;
	elem(int a, int b, string s,int m ) {this->x=a ; this->y=b; this->s=s; this->mask = m;} ;
	bool operator<(const elem &e) const  { return this->s.size() < e.s.size() || (this->s.size() == e.s.size() && this->s<e.s) ;}
	bool operator>(const elem &e) const  { return this->s.size() > e.s.size() || (this->s.size() == e.s.size() && this->s>e.s) ;}

	bool operator<=(const elem &e) const { return this->s.size() < e.s.size() || (this->s.size() == e.s.size() && this->s<=e.s) ;}
	bool operator>=(const elem &e) const { return this->s.size() > e.s.size() || (this->s.size() == e.s.size() && this->s>=e.s) ;}
	elem operator+(const char c) {
		this->s.push_back(c);
		return elem(this->x, this->y , this->s , this->mask | (1<<( c - 'a') ));
	}
	
	void operator=(const elem &e){
		this->x=e.x;
		this->y=e.y;
		this->s=e.s;
		this->mask=e.mask;
	}
	
};



inline bool valid(int x, int y , int i){
	if( (x==0 && dx[i]==-1) || (y==0 && dy[i]==-1) ) return false;
	else if ( (x==n-1 && dx[i]==1) || (y==m-1 && dy[i]==1) ) return false;

	return true;
}

inline string Dijkstra(int xs, int ys, int xt, int yt){

	priority_queue< pair<int,elem> , vector< pair<int,elem>  > , greater< pair<int,elem> > > pq;
	
	pq.push( { abs(xt-xs) + abs(ys-yt), elem(xs,ys,"",0)} );
	
	while(!pq.empty()){
		
		auto vd = pq.top(); pq.pop();
		int &d = vd.first;
		int &vx = vd.second.x ; int &vy = vd.second.y ;
		string &s = vd.second.s; int &b = vd.second.mask;
		int v = vx*m+vy;
		
		if(vx==xt && vy==yt) break;//return s;
		
		for(int i=0; i<4;i++){
			
			if(!valid(vx,vy,i)) continue;
			int ux = vx+dx[i];
			int uy = vy+dy[i];
			int u = ux*m+uy;
			
			char & muy = mat[ux][uy];
			
			if(muy == 'S') continue;
			if(muy == 'T') return s;
			
			int auxi = b |  (1<<( muy - 'a'));
			
			if(ones(auxi) >k ) continue; 
			
			if(maskS.count({auxi,u})) continue;
			maskS.insert({auxi,u});
			
			pq.push( { d-1 , elem(ux,uy,s,b) + muy });
			
			
		}
		
		
	}
	
	return STRMAX;
}

inline void go(){
	char c;
	scanf("%d %d %d" , &n, &m , &k);
	scanf("%c" , &c);
	
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			scanf("%c" , &c);
			
			if(c=='S'){ posSx = i; posSy = j; }
			else if(c=='T'){ posTx = i; posTy = j; }
			mat[i][j] = c; 
			STRMAX+="z";
		}
		scanf("%c" , &c);
	}
	STRMAX+="z";STRMAX+="z";
	string ans = Dijkstra(posSx,posSy,posTx,posTy);
	
	if(ans == STRMAX) printf("-1");
	else { for(int i=0; i<ans.size();i++) printf("%c",ans[i]);}
	printf("\n");
	
}
	
 
 
int main() {
	//fastio; 
	go();
	/*
	clock_t begin = clock();

	go();

	clock_t end = clock();
	double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
	printf("%lf\n",time_spent);
	*/
	return 0;
}