#include<bits/stdc++.h>
// no of bits to store no 2e5 is 19
// 2e5 ka 5 times square root lene se 2 or 3 ke pass pahunch jate hai
using namespace std;

#define int               long long
#define mod               998244353
#define MOD               998244353
#define MAX               1000000000
#define inf               2e18
#define ff                first
#define ss                second
#define mp                make_pair
#define pb                push_back
#define pii               pair<int,int>
#define mii               map<int, int>
#define all(x)            (x).begin(), (x).end()
#define fill(a,b)         memset(a, b, sizeof(a))
#define sp(x,y)           fixed<<setprecision(y)<<x
#define setbits(x)        __builtin_popcount(x)
#define fast_in_out       ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define rep(i,a,b)        for(int i=a;i<b;i++)
#define ll                long long


//   powermod(a,b,m) ==  powermod(a,b%(m-1),m)  when m is prime fermat's theorem a^(p-1) %p=1 p is prime
int powermod(int a,int b,int c) //  gives (a^b)%c
{
    int ans = 1,tempans=a%c;
    while(b>0)
    {
        if((b&1)==1)
        {
            ans=(ans*tempans)%c;
        }
             tempans=(tempans*tempans)%c;
             b=b>>1;
    }
    return ans;
}

int modinverse(int a,int m)   // gives a inverse wrt m and m is prime
{
    return powermod(a,m-2,m);
}

ll add(ll x, ll y) {
   x += y;
   if (x >= mod) return x - mod;
   return x;
}
ll sub(ll x, ll y) {
   x -= y;
   if (x < 0) return x + mod;
   return x;
}
ll mult(ll x, ll y) {
   return (x * y) % mod;
}
// my template                                              m
// prime factorization                                      pf
// ncr and factorials                                       ncr
// matrix exponentiation of fibonacci series in log(n)      matexpofib
// cycles in a graph                                        cycle
// prime factorization in log(n)                            spf
// disjoint set union                                       dsu

int spf[200005];
void pre()  // call it in main
{
    spf[0]=1;
    spf[1]=1;
    for(int i=2;i<=2e5;i++){
        spf[i]=i;
    }
    for(int i=2;i*i<=2e5;i++){
        if(spf[i]==i){
            for(int j=i*i;j<=2e5;j+=i){
                if(spf[j]==j){
                    spf[j]=i;
                }
            }
        }
    }
}

int fact[2000005],inversefact[2000005];

void precomputations(int n)  // is function ko main main ek bar call kr do
{
    fact[0]=1;
    inversefact[0]=1;
    for(int i=1;i<n;i++)
    {
        fact[i]=(fact[i-1]*i)%MOD;
        inversefact[i]=(inversefact[i-1]*modinverse(i,MOD))%MOD;

    }
}

int ncr(int n,int r)
{
   if(n==r|r==0)
        return 1;
    if(r>n)
        return 0;
    if(n<0)
        return 0;
    int temp= fact[n];
    temp= (temp*inversefact[r])%MOD;
    temp=(temp*inversefact[n-r])%MOD;
    return temp;
}
void solve()
{
   int n,m;
   cin>>n>>m;
   int ans =0;
   for(int i=1;i<=m;i++)
   {

         int z=i;
         int temp=1;
         while(z!=1)   // in solve function
         {
               int k = z,cnt=0;
               while(k%spf[z]==0)// (n-1+cnt)
               {
                     cnt++;
                     k/=spf[z];
               }
               temp= mult(temp,ncr(n-1+cnt,n-1));

                  z=k;
         }
         //cout<<i<<" "<<temp<<" "<<endl;
         ans=add(ans,temp);


   }
   cout<<ans;




}


int32_t main()
{
  fast_in_out;

  int t=1;//cin>>t;
  int count=0;
 pre();precomputations(2000005);

   while(t--)
   {
       count++;
       solve();
   }
}

#include <bits/stdc++.h>
using namespace std;
#define lli long long int
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define test(x) cout << "Line(" << __LINE__ << ") " #x << ' ' << x << endl
#define printv(x) {\
	for (auto i : x) cout << i << ' ';\
	cout << endl;\
}
#define pii pair <int, int>
#define pll pair <lli, lli>
#define X first
#define Y second
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
template<typename A, typename B>
ostream& operator << (ostream& o, pair<A, B> a){
    return o << a.X << ' ' << a.Y;
}
template<typename A, typename B>
istream& operator >> (istream& o, pair<A, B> &a){
    return o >> a.X >> a.Y;
}
const int mod = 998244353, abc = 864197532, N = 300101, logN = 19, K = 333;

lli modpow(lli a, int b) {
    lli ans = 1;
    for (; b; b >>= 1, a = a * a % mod) {
        if (b & 1) ans = ans * a % mod;
    }
    return ans;
}

int main () {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, m, k;
    cin >> n >> m >> k;
    if (n == 1 || m == 1) {
        cout << modpow(k, n + m - 1) << endl;
        return 0;
    }
    lli ans = 0;
    for (int i = 1; i <= k; ++i) {
        ans = (ans + (modpow(i, n) + mod - modpow(i - 1, n)) % mod * modpow(k - i + 1, m)) % mod;
    }
    cout << ans << endl;
}