# include <cstdio>

namespace Main {
    namespace Source {
        typedef unsigned int uint;
        static inline const uint qpow(uint b, uint e, const uint mod) {
            uint r(1);
            while (e) {
                if (e bitand 1) r = 1ull * r * b % mod;
                b = 1ull * b * b % mod, e >>= 1;
            }
            return r;
        }
    }
    using namespace Source;
    static const uint P(998244353);
    static uint n, m, k;
    static uint ans;
    static inline const void main() {
        scanf("%u%u%u", &n, &m, &k);
        if (n == 1 and m == 1) return (const void)printf("%u\n", k);
        if (n == 1) {
            for (register uint i(1); i <= k; ++i)
                ans =
                (ans + (qpow(k - i + 1, m, P) + P - qpow(k - i, m, P))) % P;
            goto end;
        }
        if (m == 1) {
            for (register uint i(1); i <= k; ++i)
                ans =
                (ans + (qpow(i, n, P) + P - qpow(i - 1, n, P))) % P;
            goto end;
        }
        for (register uint i(1); i <= k; ++i)
            ans = (ans + 1ull * (qpow(i, n, P) + P - qpow(i - 1, n, P)) * qpow(k - i + 1, m, P)) % P;
    end:printf("%u\n", ans);
    }
}

signed int main() { Main::main(); return 0; }
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <string>
#include <map>
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
#include <random>
#include <stack>
#include <set>
#include <list>
#include <unordered_set>
//#include <atcoder/convolution>
//#include <atcoder/modint>

#define bug(x) cout<<"zdongdebug1: "<<x<<endl;
#define bug2(x, y) cout<<"zdongdebug2: "<<x<<" "<<y<<endl;
#define bug3(x, y, z) cout<<"zdongdebug3: "<<x<<" "<<y<<" "<<z<<endl;
using namespace std;
//using Modint = atcoder::modint998244353;
typedef long long ll;
void ex_gcd(ll a,ll b, ll& d,ll& x,ll& y){
  if(!b) {d=a;x=1;y=0;}
  else   {	ex_gcd(b,a%b,d,y,x);	y-=a/b*x;}
}
ll inv(ll a,ll n)  {
  ll d,x,y;	ex_gcd(a,n,d,x,y);
  return d==1?(x%n+n)%(n/d):-1;
}
ll gcd(ll x, ll y){
  if(y==0)return x;
  return gcd(y, x%y);
}
const int maxn = 5005;
const int mod = 998244353;

ll p[maxn];
ll cal(int x, int y){
  if(x<y)return 0;
  return p[x]*inv(p[y]*p[x-y]%mod, mod)%mod;
}

ll f[13][maxn];

int main() {
#ifdef suiyuan2009
  freopen("/Users/suiyuan2009/CLionProjects/icpc/input.txt", "r", stdin);
  //freopen("/Users/suiyuan2009/CLionProjects/icpc/output.txt", "w", stdout);
#endif
  p[0] = 1;
  for(int i=1;i<maxn;i++)p[i] = p[i-1]*i%mod;
  int n,m;
  cin>>n>>m;
  for(int i=0;i<=m;i+=2)f[0][i] = cal(n, i);
  for(int i=0;i+1<13;i++)
  for(int j=0;j<=m;j++){
    if(f[i][j]==0)continue;
    for(int k=0;j+k*(1<<(i+1))<=m;k+=2){
      f[i+1][j+k*(1<<(i+1))] = (f[i+1][j+k*(1<<(i+1))] + f[i][j]*cal(n,k)%mod)%mod;
    }
  }
  cout<<f[12][m]<<endl;
  return 0;
}