#include using namespace std; #define ll long long #define db double #define up(i,j,n) for (int i = j; i <= n; i++) #define down(i,j,n) for (int i = j; i >= n; i--) #define cadd(a,b) a = add (a, b) #define cpop(a,b) a = pop (a, b) #define cmul(a,b) a = mul (a, b) #define pr pair #define fi first #define se second #define SZ(x) (int)x.size() #define bin(i) (1 << (i)) #define Auto(i,node) for (int i = LINK[node]; i; i = e[i].next) template inline void cmax(T & x, T y){y > x ? x = y : 0;} template inline void cmin(T & x, T y){y < x ? x = y : 0;} const int mod = 1e9 + 7; const int MAXN = 1e5 + 5; inline int add(int a, int b){a += b; return a >= mod ? a - mod : a;} inline int pop(int a, int b){a -= b; return a < 0 ? a + mod : a;} inline int mul(int a, int b){return 1LL * a * b % mod;} int f[MAXN], g[MAXN]; int main(){ int n, k, x; scanf("%d%d%d", &n, &k, &x); if (x == 1) { f[1] = 0; g[1] = 1; }else { f[1] = 1; g[1] = 0; } up (i, 2, n) { cadd(f[i], mul(f[i - 1], k - 2)); cadd(f[i], mul(g[i - 1], k - 1)); cadd(g[i], f[i - 1]); } printf("%d\n", g[n]); return 0; }