import java.io.*; /** * * @author pmaddala */ public class Solution{ /** * @param args the command line arguments */ static final int MOD = 1000000007; static long pow(int x, int y){ if(y==0){ return 1; } long ans = pow(x,y/2); ans = (ans*ans)%MOD; if(y%2==1){ ans = (ans*x)%MOD; } return ans; } static long countArray(int n, int k, int x) { // Return the number of ways to fill in the array. long init = pow(k-1,n-2); // System.out.println("INIT "+init); long normal = 0; for(int i=2;i<=n-1;i++){ normal = (pow(k-1,i-1)+MOD-normal)%MOD; } // System.out.println("Normal "+normal+" Total "+pow(k-1,n-2)); long ones = (pow(k-1,n-2)+MOD-normal)%MOD; long other = (normal*pow((k-1),MOD-2))%MOD; // System.out.println("Ones "+ones); // System.out.println("Other "+other); long ans = init; if(x==1){ ans = (ans+MOD-ones)%MOD; } else{ ans = (ans+MOD-other)%MOD; } return ans; } public static void main(String[] args) throws IOException{ // TODO code application logic here InputReader in = new InputReader(); // Scanner in = new Scanner(System.in); int n = in.readInt(); int k = in.readInt(); int x = in.readInt(); long answer = countArray(n, k, x); System.out.println(answer); // in.close(); } final static class InputReader { //This IO class belongs to Ashok Rajpurohit (@ashok1113) byte[] buffer = new byte[8192]; int offset = 0; int bufferSize = 0; final InputStream in = System.in; public int readInt() throws IOException { int number = 0; int s = 1; if (offset == bufferSize) { offset = 0; bufferSize = in.read(buffer); } if (bufferSize == -1) { throw new IOException("No new bytes"); } for (; buffer[offset] < 0x30 || buffer[offset] == '-'; ++offset) { if (buffer[offset] == '-') { s = -1; } if (offset == bufferSize - 1) { offset = -1; bufferSize = in.read(buffer); } } for (; offset < bufferSize && buffer[offset] > 0x2f; ++offset) { number = (number << 3) + (number << 1) + buffer[offset] - 0x30; if (offset == bufferSize - 1) { offset = -1; bufferSize = in.read(buffer); } } ++offset; return number * s; } public int[] readIntArray(int n) throws IOException { int[] ar = new int[n]; for (int i = 0; i < n; i++) { ar[i] = readInt(); } return ar; } public int[] readIntArray1(int n) throws IOException { int[] ar = new int[n + 1]; for (int i = 1; i <= n; i++) { ar[i] = readInt(); } return ar; } public long readLong() throws IOException { long res = 0; int s = 1; if (offset == bufferSize) { offset = 0; bufferSize = in.read(buffer); } for (; buffer[offset] < 0x30 || buffer[offset] == '-'; ++offset) { if (buffer[offset] == '-') { s = -1; } if (offset == bufferSize - 1) { offset = -1; bufferSize = in.read(buffer); } } for (; offset < bufferSize && buffer[offset] > 0x2f; ++offset) { res = (res << 3) + (res << 1) + buffer[offset] - 0x30; if (offset == bufferSize - 1) { offset = -1; bufferSize = in.read(buffer); } } ++offset; if (s == -1) { res = -res; } return res; } public long[] readLongArray(int n) throws IOException { long[] ar = new long[n]; for (int i = 0; i < n; i++) { ar[i] = readLong(); } return ar; } public String read() throws IOException { StringBuilder sb = new StringBuilder(); if (offset == bufferSize) { offset = 0; bufferSize = in.read(buffer); } if (bufferSize == -1 || bufferSize == 0) { throw new IOException("No new bytes"); } for (; buffer[offset] == ' ' || buffer[offset] == '\t' || buffer[offset] == '\n' || buffer[offset] == '\r'; ++offset) { if (offset == bufferSize - 1) { offset = -1; bufferSize = in.read(buffer); } } for (; offset < bufferSize; ++offset) { if (buffer[offset] == ' ' || buffer[offset] == '\t' || buffer[offset] == '\n' || buffer[offset] == '\r') { break; } if (Character.isValidCodePoint(buffer[offset])) { sb.appendCodePoint(buffer[offset]); } if (offset == bufferSize - 1) { offset = -1; bufferSize = in.read(buffer); } } return sb.toString(); } public String read(int n) throws IOException { StringBuilder sb = new StringBuilder(n); if (offset == bufferSize) { offset = 0; bufferSize = in.read(buffer); } if (bufferSize == -1 || bufferSize == 0) { throw new IOException("No new bytes"); } for (; buffer[offset] == ' ' || buffer[offset] == '\t' || buffer[offset] == '\n' || buffer[offset] == '\r'; ++offset) { if (offset == bufferSize - 1) { offset = -1; bufferSize = in.read(buffer); } } for (int i = 0; offset < bufferSize && i < n; ++offset) { if (buffer[offset] == ' ' || buffer[offset] == '\t' || buffer[offset] == '\n' || buffer[offset] == '\r') { break; } if (Character.isValidCodePoint(buffer[offset])) { sb.appendCodePoint(buffer[offset]); } if (offset == bufferSize - 1) { offset = -1; bufferSize = in.read(buffer); } } return sb.toString(); } } }