#include using namespace std; //#define int int64_t #define el '\n' namespace combinatorics { int64_t MOD = 1e9 + 7; int size = 0; vector _fact = {1}; vector _invfact = {1}; vector _inv = {1}; int64_t pw(int64_t n, int64_t e) { int64_t ans = 1; for (; e; n = n * n % MOD, e /= 2) if (e & 1) ans = ans * n % MOD; return ans; } void init(int N) { _fact.resize(N + 1); _invfact.resize(N + 1); _inv.resize(N + 1); for (int64_t i = size + 1; i <= N; i++) { _fact[i] = _fact[i - 1] * i % MOD; } _invfact[N] = pw(_fact[N], MOD - 2); for (int i = N; i >= size + 1; i--) { _invfact[i - 1] = 1LL * _invfact[i] * i % MOD; _inv[i] = 1LL * _invfact[i] * _fact[i - 1] % MOD; } size = N; } int64_t fact(int n) { if (n > size) init(2 * n); return _fact[n]; } int64_t invfact(int n) { if (n > size)init(2 * n); return _invfact[n]; } int64_t inv(int n) { if (n > size)init(2 * n); return _inv[n]; } int64_t npr(int n, int r) { if (n < r)return 0; return fact(n) * invfact(n - r) % MOD; } int64_t ncr(int n, int r) { return npr(n, r) * invfact(r) % MOD; } int64_t catalan(int n) { return ncr(2 * n, n) * inv(n + 1) % MOD; } int64_t stars_and_bars(int star, int bar) { return ncr(star + bar - 1, star); } } using namespace combinatorics; int64_t pw(int64_t n , int64_t e,int64_t mod) { int64_t ans = 1; for (; e; n = n * n % mod, e /= 2) if (e & 1) ans = ans * n % mod; return ans; } void Main() { int n; cin >> n; int64_t ans = 0; for (int i = 1; i <= n; ++i) { ans += (ncr(n, i) * pw(i, n - i, MOD)) % MOD; ans %= MOD; } cout << ans; } void Thaer(); int32_t main() { cin.tie(0)->sync_with_stdio(0); // Thaer(); int T = 1; // cin >> T; for (int i = 1; i <= T; ++i) { Main(); // if (i != T)cout << el; } } void Thaer() { if (fopen("input.txt", "r")) { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); } }