#include <iostream>
#include <queue>
#include <ctime>
#include <cassert>
#include <cmath>
#include <string>
#include <cstring>
#include <vector>
#include <fstream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <set>
#include <map>
#include <iomanip>
#define nextLine() { for (int c = getchar(); c != '\n' && c != EOF; c = getchar()); }
#define sqr(a) ((a)*(a))
#define has(mask,i) (((mask) & (1<<(i))) == 0 ? false : true)

#ifdef LOCAL
	#define eprintf(...) fprintf(stderr, __VA_ARGS__)
#else
	#define eprintf(...)
#endif

#define TASK "travel"
using namespace std;

#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second

#if ( _WIN32 || __WIN32__ )
    #define LLD "%I64d"
#else
    #define LLD "%lld"
#endif

typedef long long LL;
typedef long double ldb;
typedef vector <int> vi;
typedef vector <vi> vvi;
typedef vector <bool> vb;
typedef vector <vb> vvb;

const int INF = (1 << 30) - 1;
const ldb EPS = 1e-9;
const ldb PI = fabsl(atan2l(0.0, -1.0));

int w, h, n;
char board[555][555];
void load() {
	scanf("%d%d%d", &w, &h, &n);
	for (int i = 0; i < h; i++) {
		scanf("%s", board[i]);
	}
}

const char* DIRS = "NESW";
const int dx[] = {-1, 0, 1,  0};
const int dy[] = { 0, 1, 0, -1};

inline bool good(int x, int y) {
	return 0 <= x && x < h && 0 <= y && y < w;
}

int d[555][555];
int p[555][555];
int dd[555][555];
int deg[555][555];

void solve() {
	int vx = -1, vy = -1;
	for (int i = 0; i < h; i++) {
		for (int j = 0; j < w; j++) {
			d[i][j] = INF;
			if (board[i][j] == 'V') {
				vx = i;
				vy = j;
				board[i][j] = 'A';
			}
			if (board[i][j] == 'T') {
				deg[i][j] = 1;
				for (int dir = 0; dir < 4; dir++) {
					int nx = i + dx[dir];
					int ny = j + dy[dir];
					if (good(nx, ny) && board[nx][ny] == 'T') {
						deg[i][j]++;
					}
				}
			}
		}
	}
	deque <pii> q;
	d[vx][vy] = 0;
	dd[vx][vy] = 0;
	q.push_front(mp(vx, vy));
	while (!q.empty()) {
		int x = q.front().fi;
		int y = q.front().se;
		q.pop_front();
		for (int dir = 0; dir < 4; dir++) {
			int nx = x + dx[dir];
			int ny = y + dy[dir];
			if (!good(nx, ny)) {
				continue;
			}
			int c = board[nx][ny] == 'T' ? 0 : 1;
			if (d[nx][ny] > d[x][y] + c) {
				d[nx][ny] =  d[x][y] + c;
				dd[nx][ny] = dd[x][y] + 1;
				p[nx][ny] = dir;
				if (c == 0) {
					q.push_front(mp(nx, ny));
				} else {
					q.pb(mp(nx, ny));
				}
			}
		}
	}

	int best = INF;
	int toX = -1, toY = -1;
	for (int i = 0; i < h; i++) {
		for (int j = 0; j < w; j++) {
			if (board[i][j] != 'T') {
				continue;
			}
			int taken = dd[i][j] - d[i][j];
			if (taken > n) {
				continue;
			}
			int cur;
			if (deg[i][j] == 1) {
				cur = dd[i][j] + 2 * (n - taken);
			} else {
				cur = dd[i][j] + n - taken;
			}
			if (cur < best) {
				best = cur;
				toX = i;
				toY = j;
			}
		}
	}
	string answer = "";
	for (int x = toX, y = toY; x != vx || y != vy; ) {
		assert(good(x, y));
		if (board[x][y] == 'T') {
			n--;
		}
		int dir = p[x][y];
		answer += DIRS[dir];
		x -= dx[dir];
		y -= dy[dir];
	}
	reverse(answer.begin(), answer.end());
	while (n > 0) {
		int next = -1;
		int any = -1;
		for (int dir = 0; dir < 4; dir++) {
			int nx = toX + dx[dir];
			int ny = toY + dy[dir];
			if (!good(nx, ny)) {
				continue;
			}
			any = dir;
			if (board[nx][ny] == 'T') {
				next = dir;
				break;
			}
		}
		assert(any != -1);
		if (next == -1) {
			next = any;
		}
		toX += dx[next];
		toY += dy[next];
		answer += DIRS[next];
		if (board[toX][toY] == 'T') {
			--n;
		}
	}
	puts(answer.c_str());
}

int main() {
	clock_t start = clock();
	freopen(TASK".in", "r", stdin);
	freopen(TASK".out", "w", stdout);
	load();
	solve();
	eprintf("time: %.3lf\n", (double)(clock() - start) / CLOCKS_PER_SEC);
	return 0;
}
