//#undef DEBUG
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll llinf = (1ll<<61)-1;
#define sz(a) int(a.size())
#define all(x) begin(x), end(x)
#ifdef DEBUG
const int DEBUG_END = 26;
#define DOS cout
#include <debug.h>
#else
#define bug(args...) void()
#define cbug(a, args...)
#endif
#define ASSERT(a, o, b, args...) if (!((a)o(b))) bug(a, b, ##args), assert((a)o(b));
#define fi first
#define se second
int TC = 1, CN;
const int inf = 998244353;
template<class C, class D> bool operator ==(const C &ls, const D &rs) { return !(ls<rs or rs<ls); }//{
template<class C, class D> bool operator !=(const C &ls, const D &rs) { return !(rs==ls); }
template<class C, class D> bool operator >(const C &ls, const D &rs) { return rs<ls; }
template<class C, class D> bool operator <=(const C &ls, const D &rs) { return !(rs<ls); }
template<class C, class D> bool operator >=(const C &ls, const D &rs) { return !(ls<rs); }
// += can't be made generic as x+=y is not the same as x=x+y when x is string
template<class C, class D> C& operator -=(C &x, const D &y) { return x = x-y; }
template<class C, class D> C& operator *=(C &x, const D &y) { return x = x*y; }
#include <ext/numeric>
using __gnu_cxx::power;
template<int mod> struct mint// Make sure to not do any operation with int outside [-mod, 2*mod), *1 to mod forcefully), use << instead of 2*
{
    int x;
    mint() = default;
    mint(const int &rs) : x(rs + (rs>=0 ? 0 : mod) - (rs<mod ? 0 : mod)) {};
    mint operator -() { return -x; }
    // mint operator ~() = delete;  // when mod is not surely prime
    mint operator ~() { ASSERT(x, !=, 0, "modinverse 0 is undefined"); return power(*this, mod-2); }
    mint operator +(const mint &rs) const { return x+rs.x; }
    mint& operator +=(const mint &rs) { return *this = *this + rs; }
    mint operator -(const mint &rs) const { return x-rs.x; }
    mint operator *(const mint &rs) const { return int(x*ll(rs.x)%mod); }
    mint operator <<(const int &rs) { return rs==1 ? *this+*this : *this*mint{1<<rs}; }
    mint& operator <<=(const int &rs) { return *this = *this<<rs; }
    mint& operator >>=(const int &rs) { return x>>=rs, *this; }  // only for power()
    mint& operator ++() { return *this += 1; }
    mint& operator --() { return *this -= 1; }
    mint operator ++(int) { mint ret = x; ++*this; return ret; }
    mint operator --(int) { mint ret = x; --*this; return ret; }
    friend istream& operator >>(istream &is, mint &rs) { return is>>rs.x; }
    friend ostream& operator <<(ostream &os, const mint &rs) { return os<<rs.x; }
    friend mint operator +(const mint &ls, const int &rs) { return ls+mint(rs); }
    friend mint operator +(const int &ls, const mint &rs) { return mint(ls)+rs; }
    friend mint operator -(const mint &ls, const int &rs) { return ls-mint(rs); }
    friend mint operator -(const int &ls, const mint &rs) { return mint(ls)-rs; }
    friend mint operator *(const mint &ls, const int &rs) { return ls*mint(rs); }
    friend mint operator *(const int &ls, const mint &rs) { return mint(ls)*rs; }
    bool operator <(const mint &rs) const { return x<rs.x; }
    friend bool operator <(const int &ls, const mint &rs) { return ls<rs.x; }
    friend bool operator <(const mint &ls, const int &rs) { return ls.x<rs; }
};
using Int=mint<inf>;
Int operator""_i(unsigned long long x) { return {int(x)}; }//}
const int N = 200005;
int n, m, k;

signed main() { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); cout.precision(11), cout.setf(ios::fixed);
    //cin >> TC;// inputAll + resetAll -> solution
    auto kase = [&]()->void {
        cin >> n >> m >> k;
        Int ans = 0;
        if (n == 1) ans = power(Int(k), m);
        else if (m == 1) ans = power(Int(k), n);
        else {
            for (int i = 1; i <= k; i++) {
                ans += (power(Int(i), n)-(i == 1 ? 0 : power(Int(i-1), n)))*power(Int(k-i+1), m);
            }
        }
        cout << ans << '\n';
    };
    while (CN++!=TC) kase();
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod = 998244353;


ll modpow(ll a, ll n, ll mod) {
    ll res = 1;
    while (n > 0) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}

int main(){
  ll h,w,k;
  cin >> h >> w >> k;
  
  
  if(h==1){
    cout << modpow(k,w,mod) << endl;
    return 0;
  }
  
  if(w==1){
    cout << modpow(k,h,mod) << endl;
    return 0;
  }
  
  
  
  ll ans = 0;
  vector<ll> Ah(k,0);
  vector<ll> Aw(k,0);
  Ah.at(0) = 1;
  Aw.at(0) = 1;
  for(int i=2;i<=k;i++){
    Ah.at(i-1) = (modpow(i,h,mod)-modpow(i-1,h,mod))%mod;
    Aw.at(i-1) = (modpow(i,w,mod)-modpow(i-1,w,mod))%mod;
  }
  ll sum = 0;
  for(int i=1;i<=k;i++){
    //cout << Ah.at(i-1) << endl;
    sum += Ah.at(i-1);
    sum%=mod;
    ans += (sum*Aw.at(k-i))%mod;
    ans%=mod;
  }
  
  cout << ans << endl;
  return 0;
}