#include<stdio.h>
#define rep(i,N) for(int i=0;i<(int)N;i++)
static inline int IN(void)
{
  int x=0,f=0,c=getchar();while(c<48||c>57){f^=c==45,c=getchar();}
  while(c>47&&c<58){x=x*10+c-48,c=getchar();}return f?-x:x;
}
const int MOD=1e9+7;
int fact[500001]={0},inv[500001]={0};
static inline int ModPow(int a,int b){int c=1;while(b>0){if(b&1){c=1l*c*a%MOD;}a=1l*a*a%MOD;b>>=1;}return c;}
static inline void init(int sz)
{
  sz++;fact[0]=1;rep(i,sz-1)fact[i+1]=1l*fact[i]*(i+1)%MOD;
  inv[sz-1]=ModPow(fact[sz-1],MOD-2);
  rep(i,sz-1)inv[sz-2-i]=1l*inv[sz-1-i]*(sz-1-i)%MOD;
}
static inline int comb(const int n,const int k){if(k<0||n<k){return 0;}return 1l*fact[n]*inv[n-k]%MOD*inv[k]%MOD;}
static inline int P(const int n,const int k){if(k<0||n<k){return 0;}return 1l*fact[n]*inv[n-k]%MOD;}
int main()
{
  int N=IN(),M=IN(),sum=0,nega=1;init(M);
  rep(k,N+1){sum=(1l*sum+MOD+nega*1l*comb(N,k)*P(M,k)%MOD*ModPow(P(M-k,N-k),2)%MOD)%MOD;nega*=-1;}
  return printf("%d\n",sum),0;
}