import java.io.*; import java.util.StringTokenizer; public class Main { static Scanner in = new Scanner(System.in); static PrintWriter out = new PrintWriter(System.out); static long mod = (long) 1e9 + 7L; static long pow(long n, long pow) { if (pow == 0) return 1; long x = pow(n, pow / 2) % mod; if (pow % 2 == 0) { return (x * x) % mod; } else return (((n * x) % mod) * x) % mod; } public static void main(String[] args) throws IOException { long n = in.nextInt(); long k = in.nextInt(); long x = in.nextInt(); long total = pow(k - 1, n - 2); long ones = 1, others = 0; for (int i = 0; i < n - 2; i++) { long prevones = ones; ones = ((k - 1) * others) % mod; others = (((k - 2) * others) % mod + prevones) % mod; // out.println(ones + " " + others); } // out.println(total); if (x == 1) total -= ones; else total -= others; if (total < 0) total = (total + mod) % mod; out.println(total); out.flush(); } static class Scanner { StringTokenizer st; BufferedReader br; public Scanner(InputStream s) { br = new BufferedReader(new InputStreamReader(s)); } public String next() throws IOException { while (st == null || !st.hasMoreTokens()) st = new StringTokenizer(br.readLine()); return st.nextToken(); } public int nextInt() throws IOException { return Integer.parseInt(next()); } public long nextLong() throws IOException { return Long.parseLong(next()); } public String nextLine() throws IOException { return br.readLine(); } public double nextDouble() throws IOException { String x = next(); StringBuilder sb = new StringBuilder("0"); double res = 0, f = 1; boolean dec = false, neg = false; int start = 0; if (x.charAt(0) == '-') { neg = true; start++; } for (int i = start; i < x.length(); i++) if (x.charAt(i) == '.') { res = Long.parseLong(sb.toString()); sb = new StringBuilder("0"); dec = true; } else { sb.append(x.charAt(i)); if (dec) f *= 10; } res += Long.parseLong(sb.toString()) / f; return res * (neg ? -1 : 1); } public boolean ready() throws IOException { return br.ready(); } } }