                                //ABHISHEK AGRAWAL,BIT mesra//                    
                        //Newbie......You have to be odd to be no. ONE :)//
  //Authhor: Abhishekagrawal 
  //Date: 20/02/2021 
  //Time: 17:30:13 
  #include<bits/stdc++.h>
  using namespace std;
  #define ll long long int
  #define ld long double
  #define fl float
  #define vll vector<ll>
  #define pii pair<int,int>
  #define vpll vector<pair<ll,ll>>
  #define pb push_back
  #define f first
  #define s second
  #define mll map<ll,ll>
  #define mp make_pair
  #define sp(n) fixed<<setprecision(n)
  #define mod (ll)1000000007
  #define sortv(v) sort(v.begin(),v.end())
  #define INF (ll)(1e15)
  #define loop(i,n) for(int i=0;i<n;i++)
  #define loop1(i,n) for(int i=1;i<=n;i++)
  #define rloop(n,i) for(int i=n-1;i>=0;i--)
  #define sorta(a) sort(a,a+n,greater<ll>())
  #define countone(n) __builtin_popcount(n)
  #define numoftrailzero(n) __builtin_ctz(n)
  #define maxpowoftwo(n) __builtin_clz(n)
  #define leastindexwithone(n)  __builtin_ffs(n)
  #define what_is(x) cerr << #x << " is " << x << endl;
  #define pfv(v) cout<<v.size()<<"\n";loop(i,v.size()) cout<<v[i]<<" ";cout<<"\n";
  #define pv(v) loop(i,v.size()) cout<<v[i]<<" ";
  #define all(v) v.begin(),v.end()
  #define mset(dp,val) memset(dp,val,sizeof(dp))
  ll test,n;ll sum,ans;
  // #ifdef TESTING 
  // #define DEBUG fprintf(stderr, "====TESTING====\n") 
  // #define VALUE(x) cerr << "The value of " << #x << " is " << x << endl 
  // #define debug(...) fprintf(stderr, __VA_ARGS__) 
  // #else 
  // #define DEBUG 
  // #define VALUE(x) 
  // #define debug(...) 
  // #endif
  void the_happiest_place_on_earth()
  {
      ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); 
    #ifdef ENABLE_FILE_IO
      freopen("out.txt", "r", stdin);
      freopen("out1.txt", "w", stdout);
    #endif      
  } 
  // bool comp(const pair<ll,ll> &a, const pair<ll,ll> &b){
  //   if(a.s+2*a.f==b.s+2*b.f) return a.f>b.f;
  //   return (a.s+2*a.f>b.s+2*b.f);
  // }

  const int N=200040;ll a[N],b[N],c[N],par[N],Size[N],present[N],color[N];
  ll power(ll a,ll b,ll M){a%=M;ll res=1;while(b>0){if(b%2 ==1){res=(res*a)%M;}a=(a*a)%M;b/=2;} return res;}
  void testcase(){
    ll m;
    cin>>n>>m;ll k;cin>>k;
    ll mo=998244353;
    if(n==1){
      cout<<power(k,m,mo);
      return;
    }
    if(m==1){
      cout<<power(k,n,998244353);
      return;
    }
    ans=0;
    loop1(i,k){
      ll n1=power(i,n,mo);
      ll n2=power(i-1,n,mo);
      n1=((n1-n2)%mo+mo)%mo;
      n2=power(k-i+1,m,mo);
      n1=(n1*n2)%mo;
      (ans+=n1)%=mo;
    }
    cout<<ans<<"\n";
    return;
  }

  int main(){
    the_happiest_place_on_earth();
    // Today's thought: Push yourself,because no one else is going to do it for you.
    // Things are not always #000000 and #FFFFFF
    // START OF PROGRAM LOGIC
    // g++ -o a BB.cpp -DENABLE_FILE_IO;./a
    // g++ -std=c++17 -Wshadow -Wall -g -fsanitize=address -fsanitize=undefined -D_GLIBCXX_DEBUG -o a file_name.cpp;./a
    test=1;int t=0;
    // cin>>test;  
    while(test--){
      //cout<<"Case #"<<++t<<": ";
      testcase();
    } 
    cerr << "Time : " << 1000 *((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n";
    // //END OF PROGRAM LOGIC
    return 0;
  }
  /* stuff you should look for
      * int overflow, array bounds
      * special cases (n=1?)
      * do smth instead of nothing and stay organized
      * WRITE STUFF DOWN
      * DON'T GET STUCK ON ONE APPROACH
  */
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <complex>
#include <deque>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;

typedef long long ll;

const ll MOD = 998244353;

ll mod_pow(ll x, ll n) {
  ll res = 1;
  while (n > 0) {
    if (n & 1) res = res * x % MOD;
    x = x * x % MOD;
    n >>= 1;
  }
  return res;
}

int main() {
  int n, m, k;

  cin >> n >> m >> k;

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

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

  ll sumP = 0;
  ll ans = 0;
  for (int limit = 1; limit <= k; limit++) {
    ll p = (mod_pow(limit, n) - sumP + MOD) % MOD;
    sumP += p;
    sumP %= MOD;

    if (m == 1) {
      ans += p;
      ans %= MOD;
    } else {
      ans += p * mod_pow(k - limit + 1, m);
      ans %= MOD;
    }
  }
  cout << ans << endl;
}
