#include <bits/stdc++.h>
#define ALL(a)  (a).begin(),(a).end()
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
typedef pair<long long, long long> Pll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<long long> vll;
typedef vector<vector<long long>> vvll;
template <typename T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template <typename T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
const long long INF = 1LL << 60;
const int INT_INF = 1 << 30;
#define MOD 1000000007LL

int main(){
  ll H, W, K;
  cin >> H >> W >> K;

  vll count1(W-1, 0); //count1.at(i)...i~i+1に線があるとき
  vll count2(W, 0); //count2.at(i)...i番目の左右に線がないとき(i-1~i, i~i+1)
  for(int tmp = 0; tmp < (1 << (W-1)); tmp++){
    //1が隣あってないか
    bool ok = true;
    for(int i = 0; i < W-2; i++){
      if((tmp >> i) & (tmp >> (i+1))){
        ok = false;
        break;
      }
    }
    if(!ok) continue;

    for(int i = 0; i < W-1; i++){
      if((tmp >> i) & 1) count1.at(i)++;
    }

    for(int i = 0; i < W; i++){
      bool flag = true;
      if(i > 0){
        if((tmp >> (i-1)) & 1) flag = false; 
      }
      if(i < W-1){
        if((tmp >> i) & 1) flag = false;
      }
      if(flag) count2.at(i)++;
    }
  }

  vvll dp(H+2, vll(W, 0));
  dp.at(1).at(0) = 1;
  for(int i = 2; i < H+2; i++){
    for(int j = 0; j < W; j++){
      if(j > 0) dp.at(i).at(j) += dp.at(i-1).at(j-1) * count1.at(j-1) % MOD;
      dp.at(i).at(j) %= MOD;
      dp.at(i).at(j) += dp.at(i-1).at(j) * count2.at(j) % MOD;
      dp.at(i).at(j) %= MOD;
      if(j < W-1) dp.at(i).at(j) += dp.at(i-1).at(j+1) * count1.at(j) % MOD;
      dp.at(i).at(j) %= MOD;
    }
  }
  cout << dp.at(H+1).at(K-1) << endl;
}
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <iostream>
#include <iomanip> 
#include <algorithm>
#include <queue>
#include <list>
#include <numeric>
#include <stack>
#include <unordered_map>
#include <map>
#include <set>
 
using namespace std;
 
#define sz(a) int((a).size())
#define all(x) x.begin(), x.end()
#define pb push_back
#define endl '\n'
#define watch(x) cout << #x << " : " << x << endl;
 
#define FastIO ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 
typedef long long ll;
typedef vector< int > vi;
typedef vector< vi > vvi;
typedef pair< int,int > ii;
typedef vector<ii> vii;
 
const int N = int(2e5)+10;
const int K = 10005;
// const int MOD = int(1e9)+7;
const int INF = int(1e9)+5;
const ll INF64 = 1e18;

const ll MOD = 998244353;
inline ll add(ll a, ll b, ll m) { return (((a % m + b % m) % m + m) % m); }
inline ll mul(ll a, ll b, ll m) { return (((a % m * b % m) % m + m) % m); }

ll inv[N],fact[N],ifact[N];

//! Modular Exponentiation.
ll modpow (ll x,ll n) {
    if (n == 0ll) return 1ll;
    ll u = modpow(x,n/2);
    u = mul(u,u,MOD);
    if (n % 2 == 1) u = mul(u,x,MOD);
    return u;
}

void pre () {
    inv[1] = fact[0] = fact[1] = ifact[0] = ifact[1] = 1;
    for (int i=2;i<N;i++) {
        inv[i] = mul(MOD - MOD / i, inv[MOD % i], MOD);
        fact[i] = mul(i * 1ll, fact[i - 1], MOD);
        ifact[i] = mul(inv[i], ifact[i - 1], MOD);
    }
    return;
}

ll nCr (ll n,ll r) {
    if (n >= 0 && r >= 0 && n >= r) {
        return mul(fact[n],mul(ifact[r],ifact[n-r],MOD),MOD);
    }
    return 0;
}

void solve () {
    pre();
    ll n,m,k;cin>>n>>m>>k;
    ll ans = 0;
    // k1 are same as left.
    for (int k1=0;k1<=k;k1++) {
        // n-1Ck1 * m * (m-1) ^ (n-1-k1).
        ll temp = nCr(n-1,k1);
        temp = mul(temp,m,MOD);
        temp = mul(temp,modpow(m-1,n-1-k1),MOD);
        ans = add(ans,temp,MOD);
    }
    cout<<ans<<endl;
}

int main () {
    FastIO
// #ifndef ONLINE_JUDGE
//     freopen("input.txt", "r", stdin);
//     freopen("output.txt", "w", stdout);
// #endif
    int t;
    // cin>>t;
    t = 1;
    while (t--) {
        solve();
    }
    return 0;
}