
//================code===================//

//#define TLE

#ifdef TLE
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#endif

#include <bits/stdc++.h>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <ctime>

#define ci(t) cin>>t
#define co(t) cout<<t
#define LL long long
#define ld long double
#define fa(i,a,b) for(LL i=(a);i<(LL)(b);++i)
#define fd(i,a,b) for(LL i=(a);i>(LL)(b);--i)
#define setp pair<pair<int,int>,int>
#define setl pair<LL,LL>

#define M_PI 3.14159265358979323846
#define micro 0.000001

using namespace std;

#ifdef OHSOLUTION
#define ce(t) cerr<<t
#define AT cerr << "\n=================ANS=================\n"
#define AE cerr << "\n=====================================\n"
LL gcd(LL a, LL b) { return a % b ? gcd(b, a % b) : b; }
LL lcm(LL a, LL b) { return (a * b) / gcd(a, b); }
#else
#define AT
#define AE
#define ce(t)
#define __popcnt __builtin_popcount
#define gcd __gcd
#define lcm __lcm
#endif


pair <int, int> vu[9] = { {0,1},{1,0},{0,-1} ,{-1,0},{0,1},{1,0}, {-1,1} , {1,-1},{-1,-1} }; //RDLU EWSN

template<typename T, typename U> void ckmax(T& a, U b) { a = a < b ? b : a; }
template<typename T, typename U> void ckmin(T& a, U b) { a = a > b ? b : a; }
struct gcmp { bool operator()(LL a, LL b) { return a < b; } bool operator()(setl a, setl b) { return a.second < b.second; } };
struct lcmp { bool operator()(LL a, LL b) { return a > b; } bool operator()(setl a, setl b) { return a.second > b.second; } };

const int max_v = 2e5 + 7;
const int INF = 1e9 + 7;
const LL LNF = (LL)5e18 + 7ll;
const LL mod = 998244353;

LL cpow(LL x, LL k)
{	
	if (!x) return 0;
	LL ret = 1;
	while (k)
	{
		if (k & 1) ret = ret * x % mod;
		x = x * x % mod;
		k >>= 1;
	}

	return ret;
}

int main()
{
#ifdef OHSOLUTION
	freopen("input.txt", "r", stdin);
#endif	
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);				
	LL n, m, k; ci(n >> m >> k);
	LL ans = 0;

	if (n == 1 || m == 1)
	{
		co(cpow(k, n + m - 1));
		return 0;
	}

	if (n == 1) swap(n, m);

	fa(i, 1, k + 1)
	{	
		ans = (ans + cpow(i, n) * ((cpow(k - i + 1, m) - cpow(k - i, m) + mod) % mod) % mod) % mod;				
	}
	co(ans%mod);
	return 0;
}
#include<bits/stdc++.h>
#define maxn 200005
#define mod 998244353
using namespace std;
long long n,m,K;
long long pw(long long A,long long n)
{
	long long ans=1;
	while (n)
	{
		if (n&1) ans=ans*A%mod;
		n=n>>1;
		A=A*A%mod;
	}
	return ans;
}

int main()
{
	long long ans=0;
	cin>>n>>m>>K;
	if (n==1) {cout<<pw(K,m)<<endl; return 0;}
	if (m==1) {cout<<pw(K,n)<<endl; return 0;}
	for (long long zd=1;zd<=K;zd++)
	{
		long long tt=pw(zd,n),gg=pw(zd-1,n);
		tt-=gg; while (tt<0) tt+=mod;	
		ans+=tt*(pw(K-zd+1,m));
		ans%=mod;
	}
	cout<<ans<<endl;
}