let rec power ( * ) e m n =
  if n <= 0 then e
  else power ( * ) (if n land 1 = 0 then e else m * e) (m * m) (n lsr 1)

let m = 1000000007
let ( +^ ) x y = (x + y) mod m
let ( -^ ) x y = x +^ (m - y)
let ( *^ ) x y = (x * y) mod m
let ( /^ ) x y = power ( *^ ) x y (m - 2)

let perm n k = Array.fold_left ( *^ ) 1 @@ Array.init k @@ ( + ) @@ n - k + 1

(* 全体の数nを固定して，選ぶ個数kを変えた時の組み合わせの数nCkを
   intと準同型な体の上でメモ化して計算する関数
   nを固定してk以下の全てのk'に対してnCk'を計算する時，
   時間計算量はO(k)，空間計算量はO(n) *)
let binom_memo :
  (* intからの準同型写像 *)
  of_int:(int -> 'a) ->
  (* 乗算 *)
  mul:('a -> 'a -> 'a) ->
  (* 除算 *)
  div:('a -> 'a -> 'a) ->
  (* 全体の数n *)
  int ->
  (* 選ぶ個数kを受け取って，組み合わせの数nCkを返す関数 *)
  (int -> 'a)
= fun ~of_int ~mul ~div n ->
  let i = ref 0 in
  (* 組み合わせの数を覚えておく配列
     !i以下の要素は既に組み合わせの数をメモしている *)
  let a = Array.make (n / 2 + 1) (of_int 1) in
  (* 途中までの計算結果をメモしつつ，組み合わせの数nCkを求める
     nを部分適用した関数を覚えておけば，途中までの計算結果はシェアされる *)
  let rec binom_memo_aux k =
    if k <= !i
    then a.(k)
    else begin
      incr i;
      a.(!i) <- div (mul a.(!i - 1) (of_int (n - !i + 1))) (of_int !i);
      binom_memo_aux k
    end in
  fun k -> binom_memo_aux @@ min k @@ n - k;;

let () = Scanf.scanf "%d %d" @@ fun n m ->
  let dp = Array.make (n + 1) (perm m n) in
  let binom = binom_memo ~of_int:Fun.id ~mul:( *^ ) ~div:( /^ ) n in
  let perms = Array.make (n + 2) 0 in (* (m-i)P(n-i) *)
  perms.(0) <- perm m n;
  for i = 0 to n do
    dp.(i) <- dp.(i) *^ perms.(i) *^ binom i;
    perms.(i + 1) <- perms.(i) /^ (m - i)
  done;
  Printf.printf "%d\n" @@
  Array.fold_right ( -^ ) dp 0
