public class Euler857 {
    static final long MOD = 1000000007L;
    static final int kMaxBlock = 5;

    static long modPow(long base, long exp) {
        long res = 1;
        base %= MOD;
        while (exp > 0) {
            if ((exp & 1) == 1)
                res = (res * base) % MOD;
            base = (base * base) % MOD;
            exp >>= 1;
        }
        return res;
    }

    static long modInverse(long n) {
        return modPow(n, MOD - 2);
    }

    public static String solve() {
        int target = 10000000;
        long[] A = { 0, 1, 2, 6, 18, 12 };

        long[] factSmall = new long[kMaxBlock + 1];
        long[] invFactSmall = new long[kMaxBlock + 1];
        long[] coeff = new long[kMaxBlock + 1];

        factSmall[0] = 1;
        invFactSmall[0] = 1;
        coeff[0] = 0;

        for (int i = 1; i <= kMaxBlock; ++i) {
            factSmall[i] = (factSmall[i - 1] * i) % MOD;
            invFactSmall[i] = modInverse(factSmall[i]);
            coeff[i] = (A[i] * invFactSmall[i]) % MOD;
        }

        long[] H = new long[target + 1];
        H[0] = 1;
        long factN = 1;

        for (int n = 1; n <= target; ++n) {
            long sum = 0;
            int limit = Math.min(n, kMaxBlock);
            for (int j = 1; j <= limit; ++j) {
                sum += (coeff[j] * H[n - j]) % MOD;
            }
            H[n] = sum % MOD;
            factN = (factN * n) % MOD;
        }

        long result = (H[target] * factN) % MOD;
        return Long.toString(result);
    }

    public static void main(String[] args) {
        System.out.println(solve());
    }
}
