#include using namespace std; long long n, m = 1; const long long M = 1e9 + 7; long long p[556][556], c[556][556]; long long powm(long long a, long long b) { long long u = 1, v = a; while (b > 0) { if (b & 1) u = u * v % M; b >>= 1; v = v * v % M; } return u; } int main() { cin >> n; c[0][0] = 1; for (int i = 1; i <= n; i++) { c[i][0] = 1; c[i][i] = 1; for (int j = 1; j < n; j++) c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % M; } p[0][0] = 1; for (int i = 1; i <= n; i++) { p[i][0] = 1; p[i][i] = 1; for (long long j = 1; j < n; j++) p[i][j] = (p[i - 1][j - 1] + (j + 1) * p[i - 1][j]) % M; } for (long long i = 1; i < n; i++) { for (long long j = 0; j < n - i; j++) { m = (m + p[n - j - 1][i] * c[n][j] % M * powm(i * (i + 1), j) % M) % M; } } cout << m << endl; }