#pragma GCC optimize ("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse4")
#include"bits/stdc++.h"
using namespace std;
typedef long long ll;
#define int ll
inline int in(){int x;scanf("%lld",&x);return x;}
const int N=5e5+3;
const int mod=1e9+7;
int f[N],inv[N];
int modp(int a,int b)
{
	if(b==0)return 1;
	int u=modp(a,b/2);
	u=(u*u)%mod;
	if(b&1)return (a*u)%mod;
	return u;
}
int choose(int n,int r)
{
	if(n<r)return 0;
	int res=f[n]*inv[n-r];
	res%=mod;res*=inv[r];
	res%=mod;
	return res; 
}
int32_t main()
{
	int n=in();int m=in();
	f[0]=1;inv[0]=modp(1,mod-2);
	for(int i=1;i<=m;i++)f[i]=(f[i-1]*i)%mod;
	inv[m]=modp(f[m],mod-2);
	for(int i=m-1;i>=0;i--)inv[i]=((i+1)*inv[i+1])%mod;
	int ans=0,cur=1,tmp;
	for(int i=0;i<=n;i++)
	{
		tmp=choose(m-i,n-i)*choose(n,i);tmp%=mod;
		tmp*=f[n-i];tmp%=mod;
		ans+=(cur*tmp);cur=-cur;
		ans+=mod;ans%=mod;
	}	
	int perm=choose(m,n)*f[n];perm%=mod;
	cout<<(ans*perm)%mod;
	
}