#include<bits/stdc++.h> 
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
#define f(x, m) for(auto x : m)
#define cpu() ios::sync_with_stdio(false); cin.tie(nullptr)
#define pb push_back
#define pii pair<int,int>
#define pll pair<ll, ll>
#define vi vector<int>
#define vl vector<ll>
#define vii vector<pair<int ,int>>
#define vll vector<pair<ll ,ll>>
#define all(v) v.begin(),v.end()
#define sor(a) sort( a.begin(), a.end() )
#define ros(a) sort( a.rbegin(), a.rend())
#define prec(n) fixed << setprecision(n)
#define ff first
#define ss second
#define print(x) for(auto it : x) cout << it << " ";
#define debug(x) cerr << #x << " is " << x << endl;

typedef long long ll;
using namespace std;
// using namespace __gnu_pbds;
#define dbg(args...){ string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
void err(istream_iterator<string> it) {cout << "NEXT\n"; }
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
cerr << *it << " = " << a << ", ";
err(++it, args...);
}
template<typename... T>
void rd(T& ... args){
  ((cin >> args), ...);
}
template<typename... T>
void ps(T ... args){
  ((cout << args << ' '), ...);
  cout << '\n';
}
// using ordered_set = tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update>;
const ll MOD = 1e9 + 7, MOD1 = 998244353LL, MAX = 1e6+ 5;
const char nl = '\n';      
const int INF = 1e9 + 5; 
int n, m, k;
ll mu(ll x, ll y){
  return (x * y) % MOD1;
}
int re(int x, int y){
  x -= y; 
  if(x < 0){
    x += MOD1;
  }
  return x;
}
void add(int& x, int y){
  x += y;
  if(x >= MOD1){
    x -= MOD1;
  }
}
ll pot(ll x, ll y){
  if(y == 0) return 1; 
  if(y & 1) return (pot(x, y - 1) * x) % MOD1;
  ll k = pot(x, y / 2);
  return (k * k) % MOD1;
}
ll inv(ll x){
  return pot(x, MOD1 - 2);
}
void solve(){
  cin >> n >> m >> k;
  if(n == m && n == 1){
    cout << k << '\n';
    return;
  }
  if(n == 1 || m == 1){
    int ans = 0;
    for(int i = 1; i <= k; i++){
    add(ans, mu(re(pot(i, n), pot(i - 1, n)), re(pot(k - i + 1, m), pot(k - i, m))));
    }
    cout << ans << '\n';
    return;
  }
  int ans = 0;
  for(int i = 1; i <= k; i++){
    add(ans, mu(re(pot(i, n), pot(i - 1, n)), pot(k - i + 1, m)));
  }
  cout << ans << '\n';
}
int main(){
  cpu();
  int __ = 1;
  // cin >> __;
  while(__--){
    solve();
  }
  return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = (2e5 + 10), INF = 0x3f3f3f3f3f3f3f3f, mod = 998244353;
int ksm(int a, int b) {
    int res = 1;
    while (b) {
        if (b & 1) res = (res * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    return res;
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int n, m, k;
    cin >> n >> m >> k;
    int ans = 0;
    if (n == 1) {
        for (int i = 1; i <= k; i++)
            ans = (ans + (ksm(i, m) - ksm(i - 1, m))) % mod;
    } else if (m == 1) {
        for (int i = 1; i <= k; i++)
            ans = (ans + (ksm(i, n) - ksm(i - 1, n))) % mod;
    } else {
        for (int i = 1; i <= k; i++)
            ans =
                (ans + (ksm(i, n) - ksm(i - 1, n)) * (ksm(k - i + 1, m))) % mod;
    }
    cout << (ans % mod + mod) % mod << "\n";
    return 0;
}