#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <queue>
#include <string>
#include <set>
#include <bitset>
#include <unordered_map>
#include <cmath>
#include <functional>
#include <map>
#include <cstdlib>
#include <stack>
#include <cassert>

// aliases
using namespace std;
using ll = long long;
using Pii = pair<int, int>;
using Pll = pair<ll, ll>;
template <class T>
using Vvec = vector<vector<T> >;

// for debug
template <class T>
void debug(T& v)
{
    for(auto& x: v) cout << x << " ";
    cout << endl;
}

constexpr long long default_mod = 1e9 + 7;

//element of Z/pZ
class Modulo
{
public:
    long long p;
    long long n;

    Modulo(long long n0, long long p0);
    
    bool operator==(const Modulo rhs) const{return n == rhs.n;}
    Modulo& operator+=(const long long rhs);
    Modulo& operator+=(const Modulo& rhs);
    Modulo& operator*=(const long long rhs);
    Modulo& operator*=(const Modulo& rhs);
    Modulo& operator-=(const long long rhs);
    Modulo& operator-=(const Modulo& rhs);
    Modulo pow(const long long k) const;
    Modulo inverse() const;
    Modulo& operator/=(const long long rhs);
    Modulo& operator/=(const Modulo& rhs);
    long long get() const{return n;};
};

const Modulo operator+(const Modulo &lhs, const Modulo &rhs);
const Modulo operator+(const Modulo &lhs, const long long rhs);
const Modulo operator+(const long long lhs, const Modulo &rhs);
const Modulo operator*(const Modulo &lhs, const Modulo &rhs);
const Modulo operator*(const Modulo &lhs, const long long rhs);
const Modulo operator*(const long long lhs, const Modulo &rhs);

template <class T>
T ext_gcd(T a, T b, T& x, T& y);

//constructor
Modulo::Modulo(long long n0, long long p0 = default_mod): p(p0)
{
    n = n0 >= 0 ? n0 % p : (p - (-n0 % p)) % p;
}

//operator +=
inline Modulo& Modulo::operator+=(const long long rhs)
{
    long long rhs1 = rhs >= 0 ? rhs % p : (p - (-rhs % p)) % p;
    n = (n + rhs1) % p;
    return *this;
}

inline Modulo& Modulo::operator+=(const Modulo& rhs)
{
    (*this) += rhs.n;
    return *this;
}

//operator *=
inline Modulo& Modulo::operator*=(const long long rhs)
{
    long long rhs1 = rhs >= 0 ? rhs % p : (p - (-rhs % p)) % p;
    n = (n * rhs1) % p;
    return *this;
}

inline Modulo& Modulo::operator*=(const Modulo& rhs)
{
    (*this) *= rhs.n;
    return *this;
}

//operator -=
inline Modulo& Modulo::operator-=(const long long rhs)
{
    return *this += -rhs;
}

inline Modulo& Modulo::operator-=(const Modulo& rhs)
{
    (*this) -= rhs.get();
    return *this; 
}

//(*this)**k
Modulo Modulo::pow(const long long k) const
{
    long long ret = 1;
    long long x = n;
    long long k1 = k >= 0 ? k % (p-1) : ((p-1) - (-k % (p-1))) % (p-1);
    while(k1 > 0){
        if(k1 & 1){
            ret *= x;
            ret %= p;
        }
        x = x * x;
        x %= p;
        k1 /= 2;
    }
    return Modulo(ret, p);
}

//(*this)**(-1)
Modulo Modulo::inverse() const
{
    long long x, y;
    ext_gcd(n, p, x, y);
    return Modulo(x, p).n;
}

//operator /=
inline Modulo& Modulo::operator/=(const long long rhs)
{
    Modulo inv(rhs, p);
    inv = inv.inverse();
    return *this *= inv;
}

inline Modulo& Modulo::operator/=(const Modulo& rhs)
{
    (*this) /= rhs.get();
    return *this; 
}

//operator +
const Modulo operator+(const Modulo &lhs, const Modulo &rhs)
{
    return Modulo(lhs.get(), lhs.p) += rhs;
}

const Modulo operator+(const Modulo &lhs, const long long rhs)
{
    return Modulo(lhs.get(), lhs.p) += rhs;
}

const Modulo operator+(const long long lhs, const Modulo &rhs)
{
    return Modulo(lhs, rhs.p) += rhs;
}

//operator *
const Modulo operator*(const Modulo &lhs, const Modulo &rhs)
{
    return Modulo(lhs.get(), lhs.p) *= rhs;
}

const Modulo operator*(const Modulo &lhs, const long long rhs)
{
    return Modulo(lhs.get(), lhs.p) *= rhs;
}

const Modulo operator*(const long long lhs, const Modulo &rhs)
{
    return Modulo(lhs, rhs.p) *= rhs;
}

//operator -
const Modulo operator-(const Modulo &lhs, const Modulo &rhs)
{
    return Modulo(lhs.get(), lhs.p) -= rhs;
}

const Modulo operator-(const Modulo &lhs, const long long rhs)
{
    return Modulo(lhs.get(), lhs.p) -= rhs;
}

const Modulo operator-(const long long lhs, const Modulo &rhs)
{
    return Modulo(lhs, rhs.p) -= rhs;
}

//operator /
const Modulo operator/(const Modulo &lhs, const Modulo &rhs)
{
    return Modulo(lhs.get(), lhs.p) /= rhs;
}

const Modulo operator/(const Modulo &lhs, const long long rhs)
{
    return Modulo(lhs.get(), lhs.p) /= rhs;
}

const Modulo operator/(const long long lhs, const Modulo &rhs)
{
    return Modulo(lhs, rhs.p) /= rhs;
}

// operator <<
std::ostream& operator<<(std::ostream& os, const Modulo& m)
{
    return os << m.n;
}

//very very useful functions
//n**k
Modulo pow(Modulo n, long long k)
{
    Modulo tmp = n;
    tmp = tmp.pow(k);
    return tmp;
}

//n!
Modulo fact(long long n, long long p = default_mod, long long init_size = 1e+6){
    static bool is_init = false;
    static std::vector<long long> dat;
    if(!is_init){
        is_init = true;
        dat.resize(init_size);
        dat[0] = 1;
        for(int i=1; i<init_size; i++) dat[i] = dat[i-1] * i % p;
    }
    return Modulo(dat[n], p);
}

// 1/n!
Modulo ifact(long long n, long long p = default_mod, long long init_size = 1e+6){
    static bool is_init = false;
    static std::vector<long long> dat;
    if(!is_init){
        is_init = true;
        dat.resize(init_size);
        dat[init_size-1] = fact(init_size-1).inverse().n;
        for(int i=init_size-1; i>0; i--) dat[i-1] = dat[i] * i % p;
    }
    return Modulo(dat[n], p);
}

// initialize
void initFact(long long init_size, long long p = default_mod)
{
    fact(0, p, init_size);
    ifact(0, p, init_size);
}

//nCk
Modulo comb(long long n, long long k, long long p = default_mod)
{
    Modulo a = fact(n, p);
    Modulo b = ifact(k, p);
    Modulo c = ifact(n-k, p);
    return a * b * c;
}

// ax + by = d
template <class T>
T ext_gcd(T a, T b, T& x, T& y)
{
    x = 1; y = 0;
    T xb = 0, yb = 1;
    T xr, yr, q, r;
    while(b != 0){
        q = a/b;
        xr = x - q * xb;
        yr = y - q * yb;
        r = a - q * b;

        x = xb;
        y = yb;
        a = b;
        xb = xr;
        yb = yr;
        b = r;
    }
    return a;
}

// answer
int main()
{
    int n, m;
    cin >> n >> m;
    initFact(m+10);
    Modulo ans = 0;
    for(int i=0; i<=n; i++){
        auto s = comb(n, i) * fact(m-i) * ifact(m-n);
        if(i&1) ans -= s;
        else ans += s;
    }
    cout << ans * fact(m) * ifact(m-n) << endl;
}

Measured memory_bytes: 10724