#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;
 
#define fi first
#define se second
#define mp make_pair
#define pb push_back
 
typedef long long ll;
typedef pair<ll,ll> ii;
typedef vector<int> vi;
typedef unsigned long long ull;
typedef long double ld; 
typedef tree<ii, null_type, less<ii>, rb_tree_tag, tree_order_statistics_node_update> pbds;

vector<int> fact;
vector<int> ifact;
vector<int> inv;
vector<int> pow2;
const int MOD = (1e9 + 7);
int add(int a, int b)
{
	a+=b;
	while(a>=MOD) a-=MOD;
	return a;
}
int mult(int a, int b)
{
	return (a*1LL*b)%MOD;
}
int modpow(int a, int b)
{
	int r=1;
	while(b)
	{
		if(b&1) r=mult(r,a);
		a=mult(a,a);
		b>>=1;
	}
	return r;
}
int choose(int a, int b)
{
	if(a<b) return 0;
	if(b==0) return 1;
	if(a==b) return 1;
	return mult(fact[a],mult(ifact[b],ifact[a-b]));
}
int inverse(int a)
{
	return modpow(a,MOD-2);
}
void init(int _n)
{
	fact.clear(); ifact.clear(); inv.clear(); pow2.clear();
	fact.resize(_n+1);
	ifact.resize(_n+1);
	inv.resize(_n+1);
	pow2.resize(_n+1);
	pow2[0]=1;
	ifact[0]=1;
	fact[0]=1;
	for(int i=1;i<=_n;i++)
	{
		pow2[i]=add(pow2[i-1],pow2[i-1]);
		fact[i]=mult(fact[i-1],i);
		//ifact[i]=mult(ifact[i-1],inv[i]);
	}
	ifact[_n] = inverse(fact[_n]);
	for(int i=_n-1;i>=1;i--)
	{
		ifact[i] = mult(ifact[i + 1], i + 1);
	}
	for(int i=1;i<=_n;i++)
	{
		inv[i] = mult(fact[i-1],ifact[i]);
	}
}
	
struct DSU
{
	int S;
	
	struct node
	{
		int p; ll sum;
	};
	vector<node> dsu;
	
	DSU(int n)
	{
		S = n;
		for(int i = 0; i < n; i++)
		{
			node tmp;
			tmp.p = i; tmp.sum = 0;
			dsu.pb(tmp);
		}
	}
	
	void reset(int n)
	{
		dsu.clear();
		S = n;
		for(int i = 0; i < n; i++)
		{
			node tmp;
			tmp.p = i; tmp.sum = 0;
			dsu.pb(tmp);
		}
	}
	
	int rt(int u)
	{
		if(dsu[u].p == u) return u;
		dsu[u].p = rt(dsu[u].p);
		return dsu[u].p;
	}
	
	void merge(int u, int v)
	{
		u = rt(u); v = rt(v);
		if(u == v) return ;
		if(rand()&1) swap(u, v);
		dsu[v].p = u;
		dsu[u].sum += dsu[v].sum;
	}
	
	bool sameset(int u, int v)
	{
		if(rt(u) == rt(v)) return true;
		return false;
	}
	
	ll getstat(int u)
	{
		return dsu[rt(u)].sum;
	}
};

int dp[9][(1<<15)+13];
int len[36];
int precomp[(1<<15)+13];

int solve(vector<ii> vec)
{
	if(vec.empty()) return 1;
	vi coord;
	for(int i=0;i<vec.size();i++)
	{
		coord.pb(vec[i].fi-1); coord.pb(vec[i].se);
	}
	sort(coord.begin(),coord.end()); coord.erase(unique(coord.begin(),coord.end()),coord.end());
	DSU dsu(coord.size());
	for(int i=0;i<vec.size();i++)
	{
		dsu.merge(lower_bound(coord.begin(),coord.end(),vec[i].fi-1)-coord.begin(),lower_bound(coord.begin(),coord.end(),vec[i].se)-coord.begin());
	}	
	vi roots;
	for(int i=0;i<coord.size();i++)
	{
		if(dsu.rt(i)==i) roots.pb(i);
	}
	vi V[20];
	for(int i=0;i<coord.size();i++)
	{
		V[lower_bound(roots.begin(),roots.end(),dsu.rt(i))-roots.begin()].pb(i);
	}
	memset(dp,0,sizeof(dp));
	int coeff = 1;
	for(int i=1;i<coord.size();i++)
	{
		len[i]=coord[i]-coord[i-1];
		len[i]=mult(add(modpow(10,len[i]),MOD-1),inv[9]);
		coeff=mult(coeff,len[i]);
	}
	int k=roots.size();
	for(int i=0;i<(1<<k);i++)
	{
		vi v;
		for(int j=0;j<k;j++)
		{
			if(i&(1<<j)) 
			{
				for(int x:V[j]) v.pb(x);
			}
		}
		sort(v.begin(),v.end());
		precomp[i]=1;
		for(int j=1;j<v.size();j++)
		{
			if(v[j]-v[j-1]==1)
			{
				//cerr<<len[v[j]]+1<<'\n';
				precomp[i]=mult(precomp[i],mult(len[v[j]]+1,inverse(len[v[j]])));
			}
		}
		//cerr<<i<<' '<<precomp[i]<<'\n';
	}
	for(int i=0;i<(1<<k);i++)
	{
		if(i&1) dp[0][i]=precomp[i];
	}
	for(int i=1;i<9;i++)
	{
		for(int j=0;j<(1<<k);j++)
		{
			int b=j;
			for(;;b=((b-1)&j))
			{
				if(b==0) break;
				dp[i][j]=add(dp[i][j],mult(dp[i-1][b^j],precomp[b]));
			}
		}
	}
	int ans=0;
	for(int i=0;i<9;i++)
	{
		ans=add(ans,mult(choose(8,i),dp[i][(1<<k)-1]));
	}
	ans=mult(ans,coeff);
	return ans;
}

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	init(1131);
	int L; cin>>L;
	int n; cin>>n;
	vector<ii> vec;
	vector<ii> I;
	for(int i=0;i<n;i++)
	{
		int l,r; cin>>l>>r; l--; r--;
		vec.pb({l,r});
	}
	sort(vec.begin(),vec.end());
	int maxr=-1;
	int curl=-1;
	I.pb({-1,-1});
	for(int i=0;i<n;i++)
	{
		int l=vec[i].fi; int r=vec[i].se;
		if(l>maxr)
		{
			if(maxr!=-1) I.pb({curl,maxr});
			curl=l;
		}
		maxr=max(maxr,r);
	}
	if(maxr>=0)
	{
		I.pb({curl,maxr});
	}
	I.pb({L,L});
	int ans = 1;
	for(int i=0;i<I.size();i++)
	{
		if(i>0)
		{
			ans=mult(ans,modpow(10,I[i].fi-I[i-1].se-1));
		}
		vector<ii> V;
		for(int j=0;j<vec.size();j++)
		{
			if(vec[j].fi>=I[i].fi&&vec[j].se<=I[i].se) V.pb(vec[j]);
		}
		ans=mult(ans,solve(V));
	}
	cout<<ans<<'\n';
}



Measured memory_bytes: 1536