省-15-A-9垒骰子-矩阵
#define MOD 1000000007
typedef long long LL;
#include<map>
#include<vector>
#include<iostream>
using namespace std;
map<int,int>op;
int n,m;
void init(){
op[1]=4;
op[4]=1;
op[2]=5;
op[5]=2;
op[3]=6;
op[6]=3;
}
struct M{
LL a[6][6];
M(){
for(int i=0;i<6;i++){
for(int j=0;j<6;j++){
a[i][j]=1;
}
}
}
};
M mMultiply(M m1,M m2){
M ans;
for(int i=0;i<6;++i){
for(int j=0;j<6;++j){
ans.a[i][j]=0;
for(int k=0;k<6;++k){
ans.a[i][j]=(ans.a[i][j]+m1.a[i][k]*m2.a[k][j])%MOD;
}
}
}
return ans;
}
M mPow(M m,int k){
M ans;
for(int i=0;i<6;++i){
for(int j=0;j<6;++j){
if(i==j)ans.a[i][j]=1;
else ans.a[i][j]=0;
}
}
while(k!=0){
if((k&1)==1){
ans=mMultiply(ans,m);
}
m=mMultiply(m,m);
k>>=1;
}
return ans;
}
int main(){
init();
M cMatrix;
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
cMatrix.a[op[a]-1][b-1]=0;
cMatrix.a[op[b]-1][a-1]=0;
}
M cMatrix_n_1=mPow(cMatrix,n-1);
long long ans=0;
for(int j=0;j<6;j++){
for(int i=0;i<6;i++){
ans=(ans+cMatrix_n_1.a[i][j])%MOD;
}
}
long long t=1;
long long tmp=4;
long long p=n;
while(p!=0){
if(p&1==1) t=(t*tmp)%MOD;
tmp=(tmp*tmp)%MOD;
p>>=1;
}
printf("%lli",ans*t%MOD);
return 0;
}