#include<bits/stdc++.h>
using namespace std;

#ifndef ONLINE_JUDGE
#define debarr(a,x,y)cerr<<#a<<":";for(int i=x;i<=y;i++)cerr<<a[i]<<" ";cerr<<endl;
#define debmat(mat,row,col)cerr<<#mat<<":\n";for(int i=0;i<row;i++){for(int j=0;j<col;j++)cerr<<mat[i][j]<<" ";cerr<<endl;}
#define deb(...)dbs(#__VA_ARGS__,__VA_ARGS__)
template<class S, class T>ostream &operator<<(ostream &os, const pair<S, T> &p) {return os << "(" << p.first << "," << p.second << ")";}
template<class T>ostream &operator<<(ostream &os, const vector<T> &p) {os << "["; for (auto&it : p)os << it << " "; return os << "]";}
template<class T>ostream &operator<<(ostream &os, const set<T>&p) {os << "["; for (auto&it : p)os << it << " "; return os << "]";}
template<class T>ostream &operator<<(ostream &os, const multiset<T>&p) {os << "["; for (auto&it : p)os << it << " "; return os << "]";}
template<class S, class T>ostream &operator<<(ostream &os, const map<S, T>&p) {os << "["; for (auto&it : p)os << it << " "; return os << "]";}
template<class T>void dbs(string str, T t) {cerr << str << ":" << t << "\n";}
template<class T, class...S>void dbs(string str, T t, S... s) {int idx = str.find(','); cerr << str.substr(0, idx) << ":" << t << ","; dbs(str.substr(idx + 1), s...);}
#else
#define deb(...){}
#define debarr(a,x,y){}
#define debmat(mat,row,col){}
#endif
#define pr(x) {cout << x << "\n"; return;}
template<class T> bool umin(T &a, T b) { return a > b ? (a = b, true) : false; }
template<class T> bool umax(T &a, T b) { return a < b ? (a = b, true) : false; }

#define int              long long
#define ld               long double
#define fi               first
#define se               second
#define mp               make_pair
#define pb               push_back
#define rep(i,n)         for(int i=0;i<n;i++)
#define re(i,n)          for(int i=1;i<=n;i++)
#define fr(i,a,b)        for(int i=a;i<=b;i++)
#define fb(i,a,b)        for(int i=a;i>=b;i--)
#define sz(x)            (int)x.size()
#define all(x)           x.begin(),x.end()
#define ini(x,y)         memset(x,y,sizeof(x))
typedef vector<int>      vi;
typedef pair<int, int>   pii;
typedef vector<pii>      vii;
typedef map<int, int>    mii;
typedef set<int>         si;
const int N = 2e5 + 10;
const int mod = 1000 * 1000 * 1000 + 7;
//const int mod = 998244353;
int mpow(int a, int l) {int res = 1; while (l) {if (l & 1) res = res * 1LL * a % mod; l /= 2; a = a * 1LL * a % mod;} return res;}
int minv(int a) { return mpow(a, mod - 2);}
void add(int &a, int b) { a = ((a % mod) + (b % mod)) % mod;}
void sub(int &a, int b) { a = (a - b + mod) % mod;}
int mul(int a, int b) { return ((a % mod) * 1LL * (b % mod)) % mod;}
void division(int &a, int b) { a = mul(a, mpow(b, mod - 2));}

const int maxN = 1e6 + 10;
long long fact[maxN], rfact[maxN], inv[maxN];
void factorial()
{
	fact[0] = 1; fact[1] = 1;
	rfact[0] = 1; rfact[1] = 1;
	inv[1] = 1;
	for (int i = 2; i < maxN; i++)
	{
		inv[i] = (mod - mod / i) * inv[mod % i] % mod;
		fact[i] = fact[i - 1] * i % mod;
		rfact[i] = rfact[i - 1] * inv[i] % mod;
	}
}

int C(int n, int r) { if (n < r || r < 0 || n < 0) return 0; return fact[n] * rfact[r] % mod * rfact[n - r] % mod;}
int P(int n, int r) { if (n < r || r < 0 || n < 0) return 0; return fact[n] * rfact[r] % mod; }

void solve(int tc)
{
	int n; cin >> n;
	int ans = 0;
	for (int i = 1; i < n; i++) //count of 9 in the sequence
	{
		int x = C(n, i);//chosing i positions out of n positions
		//all other (n-i) positions can be filled with pow(9,n-i) ways
		//out of them pow(8,n-i) ways will be invalid because they will not have any zero
		int y = (mpow(9, n - i));
		sub(y, mpow(8, n - i));
		add(ans, mul(x, y));
	}
	cout << ans << endl;


}

signed main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif
	int t = 1;
	factorial();
	//cin >> t;
	for (int i = 1; i <= t; i++) solve(i);
	return 0;
}

Measured memory_bytes: 27080