#include <bits/stdc++.h>
using namespace std;

//UnionFindテンプレ
class UnionFind {
    // まとめる 判定 サイズを知る
    public:
    // Aから見た親の番号を格納する。rootだったら-1*その集合のサイズ。
    vector<int> Parent;

    // 初期化
    UnionFind(int N) {
        Parent = vector<int>(N, -1);
    }

    // Aのrootを調べる
    int root(int A) {
        if (Parent[A] < 0) return A;  // マイナスならそれはroot
        return Parent[A] = root(Parent[A]);
    }

    // rootの値をプラスに戻して返す(サイズ)
    int size(int A) {
        return -Parent[root(A)];
    }

    // くっつける関数
    bool connect(int A, int B) {
        // AとBのroot同士をくっつける
        A = root(A);  // ここのAは、"rootの場所"の意味
        B = root(B);
        if (A == B) return false;  // 既にくっついている
        if (size(A) < size(B))
        swap(A, B);            // 大きい方にくっつけるために中身交換
        Parent[A] += Parent[B];  // 中身更新
        Parent[B] = A;
        return true;
    }

    //連結か調べる関数
    bool issame(int A, int B) {
        return root(A) == root(B);
    }
};

//chmin,chmax関数(DP用)
template<class T> inline bool chmin(T& a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}
template<class T> inline bool chmax(T& a, T b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}

//aのZ/mZでの逆元
int64_t modinv(int64_t a, int64_t m) {
    int64_t b = m, u = 1, v = 0;
    while (b) {
        int64_t t = a / b;
        a -= t * b; swap(a, b);
        u -= t * v; swap(u, v);
    }
    u %= m;
    if (u < 0) u += m;
    return u;
}



//最大公約数
int64_t gcd(int64_t a, int64_t b) {
    if (a % b == 0) {
        return b;
    }
    return gcd(b, a%b);
}

//エラストテレスのふるい
vector<bool> make_is_prime(int N) {
    vector<bool> prime(N + 1, true);
    if (N >= 0) prime[0] = false;
    if (N >= 1) prime[1] = false;
    for (int i = 2; i * i <= N; i++) {
        if (!prime[i]) continue;
        for (int j = i * i; j <= N; j += i) {
            prime[j] = false;
        }
    }
    return prime;
}

const int64_t mod = 998244353;
//累乗a^b
int64_t pow(int64_t a, int64_t b) {
    int64_t ans = (int64_t)1;
    for (int64_t i = 0; i < b; i++) {
        ans *= a;
        ans %= mod;
    }
    return ans;
}

//ここから

int64_t pow2(int64_t a, int64_t b) {
    a%=mod;
    if (a == 0) return 0;
    else if (b == 0) return 1;
    else if (b % 2 == 0) {
        int64_t a1 = a*a; a%=mod;
        return pow2(a1,b/2);
    } else {
        int64_t a1 = a*a; a%=mod;
        return (a*pow2(a1,(b-1)/2))%mod;
    }
}

int main() {
    int64_t N,M,K; cin>>N>>M>>K;
    if (N == 1) {
        cout << pow2(K,M) << endl;
        return 0;
    }
    if (M == 1) {
        cout << pow2(K,N) << endl;
        return 0;
    }
    vector<int64_t> Ntimes(K+1);
    vector<int64_t> Mtimes(K+1);
    for (int64_t i = 0; i < K+1; i++) {
        Ntimes.at(i) = pow2(i,N);
        Mtimes.at(i) = pow2(i,M);
    }
    int64_t ans = 0;
    
    for (int64_t i = 0; i < K; i++) {
        int64_t pl = Ntimes.at(i+1)-Ntimes.at(i); pl%=mod;
        pl *= Mtimes.at(K-i); pl%mod;
        ans += pl; ans%=mod;
    }
    
    //int64_t x = pow(pow((int64_t)2,(int64_t)10),(int64_t)10);
    //cout << x << endl;

    if (ans < 0) ans += mod;
    cout << ans << endl;
}


#include<bits/stdc++.h>
#define title "title"
#define ll long long
#define ull unsigned ll
#define fix(x) fixed<<setprecision(x)
#define pii pair<int,int>
#define vint vector<int>
#define pb push_back
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define red(i,a,b) for(int i=(a);i>=(b);i--)
#define Help freopen("a.cpp","r",stdin)
#define db double
#define ld long db
using namespace std;
void Freopen(){
	freopen(title".in","r",stdin);
	freopen(title".out","w",stdout);
}
int read(){
	int g=0,f=1;
	char ch=getchar();
	while(ch<'0'||'9'<ch){if(ch=='-')f=-1;ch=getchar();}
	while('0'<=ch&&ch<='9'){g=g*10+ch-'0';ch=getchar();}
	return g*f;
}
const int mod=998244353;
int n,m,k;
int ksm(int x,int y){
	int re=1;
	for(;y;y>>=1,x=1ll*x*x%mod)if(y&1)re=1ll*re*x%mod;
	return re;
}
signed main(){
	//Freopen();
#ifndef ONLINE_JUDGE
	Help;
#endif
	n=read(),m=read(),k=read();
	if(n==1||m==1){
		int ans=0;
		rep(i,1,k)ans=(ans+1ll*(ksm(i,n)+mod-ksm(i-1,n))%mod*(ksm(k-i+1,m)-ksm(k-i,m)+mod)%mod)%mod;
		cout<<(ans%mod+mod)%mod;
		return signed();
	}
	int ans=0;
	rep(i,1,k)ans=(ans+1ll*(ksm(i,n)+mod-ksm(i-1,n))%mod*ksm(k-i+1,m)%mod)%mod;
	cout<<(ans%mod+mod)%mod;
	return signed();
}
