# include <cstdio>

namespace Main {
    namespace Source {
        typedef unsigned int uint;
        static inline const uint qpow(uint b, uint e, const uint mod) {
            uint r(1);
            while (e) {
                if (e bitand 1) r = 1ull * r * b % mod;
                b = 1ull * b * b % mod, e >>= 1;
            }
            return r;
        }
    }
    using namespace Source;
    static const uint P(998244353);
    static uint n, m, k;
    static uint ans;
    static inline const void main() {
        scanf("%u%u%u", &n, &m, &k);
        if (n == 1 and m == 1) return (const void)printf("%u\n", k);
        if (n == 1) {
            for (register uint i(1); i <= k; ++i)
                ans =
                (ans + (qpow(k - i + 1, m, P) + P - qpow(k - i, m, P))) % P;
            goto end;
        }
        if (m == 1) {
            for (register uint i(1); i <= k; ++i)
                ans =
                (ans + (qpow(i, n, P) + P - qpow(i - 1, n, P))) % P;
            goto end;
        }
        for (register uint i(1); i <= k; ++i)
            ans = (ans + 1ull * (qpow(i, n, P) + P - qpow(i - 1, n, P)) * qpow(k - i + 1, m, P)) % P;
    end:printf("%u\n", ans);
    }
}

signed int main() { Main::main(); return 0; }

// Problem : D - Sky Reflector
// Contest : AtCoder - AtCoder Regular Contest 113
// URL : https://atcoder.jp/contests/arc113/tasks/arc113_d
// Memory Limit : 1024 MB
// Time Limit : 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
#define int long long
#define IOS std::ios::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL);
#define pb push_back
#define mod 998244353
#define lld long double
#define mii map<int, int>
#define mci map<char, int>
#define msi map<string, int>
#define pii pair<int, int>
#define ff first
#define ss second
#define all(x) (x).begin(), (x).end()
#define rep(i,x,y) for(int i=x; i<y; i++)
#define fill(a,b) memset(a, b, sizeof(a))
#define vi vector<int>
#define setbits(x) __builtin_popcountll(x)
#define w(x)  int x; cin>>x; while(x--)
using namespace std;
const long long N=100005, INF=2000000000000000000;
int power(int a, int b, int p)
    {
        if(a==0)
        return 0;
        int res=1;
        a%=p;
        while(b>0)
        {
            if(b&1)
            res=(res*a)%p;
            b>>=1;
            a=(a*a)%p;
        }
        return res;
    }
vi prime;
bool isprime[N];
void pre()
{
    for(int i=2;i<N;i++)
    {
        if(isprime[i])
        {
            for(int j=i*i;j<N;j+=i)
            isprime[j]=false;
            prime.pb(i);
        }
    }
    return;
}
bool isPrime(int n) 
{ 
    // Corner cases 
    if (n <= 1) 
        return false; 
    if (n <= 3) 
        return true; 
  
    // This is checked so that we can skip 
    // middle five numbers in below loop 
    if (n % 2 == 0 || n % 3 == 0) 
        return false; 
  
    for (int i = 5; i * i <= n; i = i + 6) 
        if (n % i == 0 || n % (i + 2) == 0) 
            return false; 
  
    return true; 
}

int spf[N+1];
void spfFun(){
    for(int i=0;i<=N;i++) spf[i]=i;
    for(int i=2;i*i<=N;i++){
        if(spf[i]==i){
            for(int j=i*i;j<=N;j+=i){
                spf[j] = min(spf[j],i);
            }
        }
    }
}

bool isPerfectSquare(long double x) 
{   
  // Find floating point value of  
  // square root of x. 
  long double sr = sqrt(x); 
  
  // If square root is an integer 
  return ((sr - floor(sr)) == 0); 
}
void print(bool n){
    if(n){
        cout<<"YES";
    }else{
        cout<<"NO";
    }
}

int32_t main()
{
    IOS;
    // pre();
    // fill(isprime,true);
    int n,m,k;
    cin>>n>>m>>k;
    int ans=0;
    for(int i=1;i<=k;i++){
    	int p = (power(i,n,mod)-power(i-1,n,mod)+mod)%mod;
    	int q;
    	if(m==1||n==1)
    		q = (power(k-i+1,m,mod)-power(k-i,m,mod)+mod)%mod;
    	else
    		q = power(k-i+1,m,mod);
    	ans+=(p*q)%mod;
    	ans%=mod;
    }
    cout<<ans;
}