#include <bits/stdc++.h>
#pragma GCC optimize("O2")
#pragma GCC optimize("unroll-loops")
using namespace std;
const long double eps = 1e-7;
const int inf = 1000000010;
const long long INF = 10000000000000010LL;
const int mod = 1000000007;
const int MAXN = 100010, LOG = 20;
long long n, m, k, u, v, x, y, t, a, b, ans;
long long F[MAXN], I[MAXN];
long long powmod(long long a, long long b) {
  long long res = 1;
  for (; b; b >>= 1, a = a * a % mod)
    if (b & 1) res = res * a % mod;
  return res;
}
long long C(long long n, long long r) {
  if (r < 0 || r > n) return 0;
  return (F[n] * I[r] % mod) * I[n - r] % mod;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  F[0] = 1;
  for (int i = 1; i < MAXN; i++) F[i] = F[i - 1] * i % mod;
  I[MAXN - 1] = powmod(F[MAXN - 1], mod - 2);
  for (int i = MAXN - 1; i; i--) I[i - 1] = I[i] * i % mod;
  cin >> n >> k;
  if (k == 1) return cout << 1 << '\n', 0;
  long long A = k * powmod(k - 1, mod - 2) % mod, tmp = 1;
  for (int i = 0; i <= n; i++) {
    if (i & 1)
      ans -= C(n, i) * powmod(1 - tmp, n) % mod;
    else
      ans += C(n, i) * powmod(1 - tmp, n) % mod;
    tmp = tmp * A % mod;
  }
  ans = ans * powmod(k - 1, n * n) % mod;
  if (ans < 0) ans += mod;
  cout << ans << '\n';
  return 0;
}
