#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define DEBUG(x) cout << '>' << #x << ':' << x << endl;
#define REP(i,n) for(ll i=0;i<(n);i++)
#define FOR(i,a,b) for(ll i=(a);i<(b);i++)
#define FORC(i,a,b,c) for(ll i=(a);i<(b);i+=(c))
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define ff first
#define ss second
#define dd long double
#define all(x) x.begin(),x.end()
template<ll MOD = 998244353>
struct mint{
    ll x;
    ll mod = MOD;
    mint(ll x=0):x(x%MOD){}
    mint& operator+=(const mint a){
        if((x+=a.x)>=MOD) x-=MOD;
        return *this;
    }
    mint& operator-=(const mint a){
        if((x += MOD-a.x)>=MOD) x-=MOD;
        return *this;
    }
    mint& operator*=(const mint a){
        (x*=a.x)%=MOD;
        return *this;
    }
    mint operator+(const mint a) const{
        mint res(*this);
        return res+=a;
    }
    mint operator-(const mint a) const{
        mint res(*this);
        return res-=a;
    }
    mint operator*(const mint a) const{
        mint res(*this);
        return res*=a;
    }
    mint power(ll t) const{
        if(!t) return 1;
        mint a = power(t>>1);
        a*=a;
        if(t&1) a*=*this;
        return a;
    }

    mint inv() const{
        return power(MOD-2);
    }
    mint& operator/=(const mint a){
        return (*this) *= a.inv();
    }
    mint operator/(const mint a) const{
        mint res(*this);
        return res/=a;
    }
};
template<ll mod>
ostream & operator << (ostream & output,const mint<mod> & a){
        output<<a.x;
        return output;
}
template<ll mod>
istream & operator >> (istream & input, mint<mod>& a){
        input>>a.x;
        return input;
}

using mll=mint<>;
const ll N=1e6;
mll fact[N+1];
mll ifact[N+1];

void init(){
    fact[0]=fact[1]=1;
    FOR(i,2,N+1){
        fact[i]=fact[i-1]*i;
    }
    ifact[0]=1;
    ifact[1]=1;
    ifact[1]/=1;
    FOR(i,2,N+1){
        ifact[i]=1;
        ifact[i]/=i;
        ifact[i]*=ifact[i-1];
    }
}

mll pnc(ll n, ll r){
    mll a=fact[n];
    a*=ifact[r];
    a*=ifact[n-r];
    return a;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    init();
    ll n,m,k;
    cin>>n>>m>>k;
    mll ans=0;
    if(n==1 || m==1){
        ans+=mll(k).power(n*m);
        cout<<ans<<endl;
        return 0;
    }
    for(ll i=1;i<=k;i++){
        mll temp=mll(i).power(n);
        temp-=mll(i-1).power(n);
        temp*=mll(k-i+1).power(m);
        ans+=temp;
    }
    cout<<ans<<endl;
}

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

long long p=998244353;

long long BinaryExpo(long long a,long long b)
{
   a=a%p;
   long long res=1;
   while(b>0)
   {
     if(b&1) res=(res*a)%p;
     b=b>>1;
     a=(a*a)%p;
   }
   return res;
}

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
   
  long long n,m,k;
  cin>>n>>m>>k;
  
  if(n>=2 && m>=2)
  {
  	 long long ans=0;
  	 long long prv=0,curr=0;
     for(int i=1;i<=k;i++)
     {
     	curr=BinaryExpo(i,n);
        
        long long x=(curr-prv+p)%p,y=BinaryExpo(k-i+1,m); 
        x=(x*y)%p;
        ans=(ans+x)%p;     
     	prv=curr;
     }

     cout<<ans<<"\n";
     return 0;
  } 

  if(n==1 && m==1)
  {
  	cout<<k<<"\n";
  	return 0;
  }

  n=max(n,m);
  cout<<BinaryExpo(k,n)<<"\n";
  
}