#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <string>
#include <vector>
#include <array>
#include <algorithm>
#include <map>
#include <list>
#include <queue>
#include <set>
#include <iostream>
#include <fstream>
#include <chrono>

using namespace std;

const int MOD = 998244353;

int calcPow(int a, int b) {
    if (a == 0)
        return 0;
    if (b == 0)
        return 1;
    if (b == 1)
        return a % MOD;
    int64_t ans = calcPow(a, b / 2);
    ans = (ans * ans) % MOD;
    if (b % 2 == 1)
        ans = (ans * a) % MOD;
    return ans;
}

void solve(int test, istream &in) {
    int n, m, k;
    in >> n >> m >> k;
    vector<int> powM(k + 1), powN(k + 1);
    for (int i = 0; i <= k; i++) {
        powM[i] = calcPow(i, m);
        powN[i] = calcPow(i, n);
    }
    int64_t answer = 0;
    for (int c = 1; c <= k; c++) {
        int64_t cur1 = (powN[c] - powN[c - 1]) % MOD;
        int64_t cur2 = powM[k - c + 1];
        if (n == 1 || m == 1)
            cur2 = (cur2 - powM[k - c]) % MOD;
        answer = (answer + cur1 * cur2) % MOD;
    }
    if (answer < 0)
        answer += MOD;
    printf("%lld\n", answer);
}

int main(int argc, char* argv[])
{
#ifdef VLAD_LOCAL
    ifstream f("in.txt");
    auto start = std::chrono::steady_clock::now();
#else
    istream &f = cin;
#endif
    int tests = 1;
    //f >> tests;
    for (int test = 0; test < tests; test++) {
        solve(test, f);
    }
#ifdef VLAD_LOCAL
    auto end = std::chrono::steady_clock::now();
    double seconds = (double)std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() / 1000;
    printf("%.3lf\n", seconds);
#endif
    return 0;
}

//#pragma GCC optimize(3)
#include <bits/stdc++.h>
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<string.h>
#include<iostream>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define dl(x) printf("%lld\n",x);
#define di(x) printf("%d\n",x);
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const ll INF= 1e18+7;
const ll maxn = 2e6+700;
const int M = 2e5+700;
const ll mod= 998244353;
const double eps = 1e-9;
const double PI = acos(-1);
template<typename T>inline void read(T &a){char c=getchar();T x=0,f=1;while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}a=f*x;}
ll n,m;
ll a[maxn];
int dp[25][5005];
int s[5005][5005];
ll cal(ll x,ll y){
    if(y == 0 || x == y) return s[x][y] = 1;
    if(y == 1) return s[x][y] = x%mod;
    if(~s[x][y]) return s[x][y];
    return s[x][y] = (cal(x-1,y) + cal(x-1,y-1))%mod;
}
int main(){
  memset(s,-1,sizeof(s));
  read(n);read(m);
  dp[0][0] = 1;
  for(int i=1;i<=20;i++){
    if((1<<(i-1))>m){
      printf("%d\n",dp[i-1][m]);
      return 0;
    }
    for(int k=0;k<=n;k+=2){
      ll tmp = k*(1<<(i-1));
      if(tmp>m) break;
      for(ll j=tmp;j<=m;j++){
        dp[i][j] = (dp[i][j]+dp[i-1][j-tmp]*cal(n,k))%mod;
      }
    }
  }
  return 0;
}
/***
6

1 1 2 2 2 2
***/