#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <vector>
#define setIO(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
#define closefile fclose(stdin), fclose(stdout)
#define m_p make_pair
#define sz(x) (int)x.size()
#define see(x) cerr << x << " "
#define seeln(x) cerr << x << endl
#define out(x) cerr << #x << " = " << x << " "
#define outln(x) cerr << #x << " = " << x << endl
#define outarr(x, l, r) {cerr<< #x"[" << l << " ~ " << r << "] = "; for (int _i = l; _i <= r; ++_i) cerr << x[_i] << " "; cerr << endl;}
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
#define gc() getchar()
//#define gc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 21], *p1 = buf, *p2 = buf;
template <class T> void read(T &x)
{
    x = 0; int c = gc(); int flag = 0;
    while (c < '0' || c > '9') flag |= (c == '-'), c = gc();
    while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) +(c ^ 48), c = gc();
    if (flag) x = -x;
}
template <class T> T _max(T a, T b){return b < a ? a : b;}
template <class T> T _min(T a, T b){return a < b ? a : b;}
template <class T> bool checkmax(T &a, T b){return a < b ? a = b, 1 : 0;}
template <class T> bool checkmin(T &a, T b){return b < a ? a = b, 1 : 0;}
const int mod = 998244353, N = (1 << 20) + 1;
int fac[200005], ifac[200005], inv[200005];
#define Mul(a,b) (ll)(a) * (b) % mod
#define mul(a,b) (a) = (ll)(a) * (b) % mod
int Add(int x, int y) {x += y; return x >= mod ? x - mod : x;}
int Sub(int x, int y) {x -= y; return x < 0 ? x + mod : x;}
void add(int &a, int b) {a += b; if (a >= mod) a -= mod;}
void sub(int &a, int b) {a -= b; if (a < 0) a += mod;}
int qpow(int a, int b) 
{
    int ans = 1;
    while (b)
	{
		if (b & 1) mul(ans, a);
		mul(a, a);
		b >>= 1;
	}
    return ans;
}
int binom(int x, int y){return x < y ? 0 : Mul(fac[x], Mul(ifac[y], ifac[x - y]));}
int n, m, k;
void init()
{
	read(n); read(m); read(k);
}

int calc(int lim, int l)
{
	return Sub(qpow(lim, l), qpow(lim - 1, l));
}

int calc2(int lim, int l)
{
	return qpow(lim, l);
}

void solve()
{
	if (n == 1 || m == 1)
	{
		printf("%d\n", qpow(k, m * n));
		return;
	}
	int ans = 0;
	for (int i = 1; i <= k; ++i)
	{
		add(ans, Mul(calc(i, n), calc2(k - i + 1, m)));
	}
	printf("%d\n", ans);
}

int main()
{
	init();
	solve();
    return 0;
}

#include <cstdio>
#include <algorithm>
using namespace std;

#define INF 998244353

long long Pow (long long a, long long b) {
	a %= INF;
	
	long long ans = 1;
	
	while (b > 0) {
		if (b & 1) {
			ans *= a;
			ans %= INF;
		}
		a *= a;
		a %= INF;
		b >>= 1;
	}
	
	return ans;
}
int main () {
	int n, m, k;
	
	scanf ("%d %d %d", &n, &m, &k);
	if (n == 1 && m == 1) {
		printf ("%d", k);
		
		return 0;
	}
	else if (n == 1) {
		printf ("%lld", Pow (k, m));
		
		return 0;
	}
	else if (m == 1) {
		printf ("%lld", Pow (k, n));
		
		return 0;
	}
	long long ans = 0;
	
	for (int i = 1; i <= k; i ++) {
		ans += Pow (i, n) * ((Pow (k - i + 1, m) - Pow (k - i, m)) % INF) % INF;
		ans %= INF;
		ans += INF;
		ans %= INF;
	}
	printf ("%lld", ans);
}