1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 using namespace std;
7 #define Mod 1000000007
8 #define Maxn 100010
9 #define Maxd 20
10
11 int f[Maxn][Maxd],num[Maxn][Maxd],fa[Maxn*Maxd];
12 int son[Maxn*Maxd][2];
13
14 int ffa(int x)
15 {
16 if(fa[x]!=x) fa[x]=ffa(fa[x]);
17 return fa[x];
18 }
19
20 void merge(int st1,int st2,int l)
21 {
22 for(int j=18;j>=0;j--)
23 {
24 if((1<<j)<=l)
25 {
26 int x=num[st1][j],y=num[st2][j];
27 if(ffa(x)!=ffa(y)) fa[ffa(x)]=y;
28 if((1<<j)<l) merge(st1+(1<<j),st2+(1<<j),l-(1<<j));
29 return;
30 }
31 }
32 }
33
34 int main()
35 {
36 int n,m;
37 scanf("%d%d",&n,&m);
38 int cnt=0;
39 for(int j=0;(1<<j)<=n;j++) for(int i=1;i+(1<<j)-1<=n;i++)
40 {
41 num[i][j]=++cnt;
42 if(j!=0) son[cnt][0]=num[i][j-1],son[cnt][1]=num[i+(1<<j-1)][j-1];
43 }
44 for(int i=1;i<=cnt;i++) fa[i]=i;
45 for(int i=1;i<=m;i++)
46 {
47 int l1,r1,l2,r2;
48 scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
49 merge(l1,l2,r1-l1+1);
50 }
51 for(int j=18;j>0;j--)
52 {
53 for(int i=1;i<=n;i++) if(num[i][j])
54 {
55 if(ffa(num[i][j])!=num[i][j])
56 {
57 int x=num[i][j],y=ffa(num[i][j]);
58 if(ffa(son[x][0])!=ffa(son[y][0])) fa[ffa(son[x][0])]=son[y][0];
59 if(ffa(son[x][1])!=ffa(son[y][1])) fa[ffa(son[x][1])]=son[y][1];
60 }
61 }
62 }
63 int ans=1,tot=0;
64 for(int i=1;i<=n;i++) if(ffa(num[i][0])==num[i][0])
65 {
66 tot++;
67 if(ans==1) ans=1LL*ans*9%Mod;
68 else ans=1LL*ans*10%Mod;
69 }
70 if(tot==1) ans=10;
71 printf("%d\n",ans);
72 return 0;
73 }