#include <bits/stdc++.h>
using namespace std;
const int MOD = 666013;

int lgpow(int a, int b) {
    int res = 1;
    for(int i = 0; (1 << i) <= b; ++i) {
        if((1 << i) & b)
            res = 1LL * res * a % MOD;
        a = 1LL * a * a % MOD;
    }

    return res;
}

int main() {
    int n, m; cin >> n >> m;
    
    if(n < m) {
        cout << "0\n";
        return 0;
    }

    vector<int> der(m + 1, 0);
    
    der[0] = 1;

    for(int i = 2; i <= m; ++i) {
        der[i] = 1LL * (i - 1) * (der[i - 1] + der[i - 2]) % MOD;
    }
    
    int ans = der[m];

    vector<int> fact(n + 1, 1);
    vector<int> inv(n + 1, 1);
    vector<int> invFact(n + 1, 1);

    for(int i = 1; i <= n; ++i) {
        fact[i] = 1LL * fact[i - 1] * i % MOD;
    }

    for(int i = 2; i <= n; ++i) {
        inv[i] = (MOD - 1LL * (MOD / i) * inv[MOD % i] % MOD);
        assert(1LL * inv[i] * i % MOD == 1);
        invFact[i] = 1LL * invFact[i - 1] * inv[i] % MOD;
    }

    auto Comb = [&] (int a, int b) {
        if(a < b)
            return 0;
        int ans = fact[a];
        ans = 1LL * ans * invFact[b] % MOD;
        ans = 1LL * ans * invFact[a - b] % MOD;
        return ans;
    };
    
    vector<int> pp(m + 1, 1);

    for(int i = 1; i <= m; ++i)
        pp[i] = lgpow(i, n);
    
    int part = 0;

    for(int i = 0; i < m; ++i) {
        int temp = 1LL * Comb(m, i) * pp[m - i] % MOD;

        if(i % 2 == 0)
            part += temp;
        else 
            part -= temp;

        while(part < 0)
            part += MOD;
        part %= MOD;
    }

    ans = 1LL * ans * part % MOD;

    cout << ans << "\n";
}