#include<bits/stdc++.h>
using namespace std;
long long n,m,ans,f[3][1<<7][1<<7];
int pos(int x,int p){return x&(1<<p);}
bool judge(int x,int y,int z){
for(int k=1;k<m-1;++k)
if((!pos(y,k+1)||!pos(x,k+1))&&pos(y,k)&&pos(x,k+2))
return 0;
for(int k=3;k<=m;++k)
if((!pos(y,k-1)||!pos(x,k-1))&&pos(y,k)&&pos(x,k-2))
return 0;
for(int k=1;k<m;++k)
if((!pos(y,k)||!pos(y,k+1))&&pos(z,k)&&pos(x,k+2))
return 0;
for(int k=2;k<=m;++k)
if((!pos(y,k-1)||!pos(y,k))&&pos(z,k)&&pos(x,k-2))
return 0;
return 1;
}
int main(){
cin>>n>>m;
for(int j=0;j<(1<<m);++j)
f[0][j<<1][0]=1;
for(int j=0;j<(1<<m);++j)
ans++,ans%=1000000007;
for(int j=0;j<(1<<m);++j)
for(int k=0;k<(1<<m);++k)
if(judge(j<<1,k<<1,0))
f[1][j<<1][k<<1]+=f[0][k<<1][0];
for(int j=1;j<(1<<m);++j)
for(int k=1;k<(1<<m);++k)
if(judge(j<<1,k<<1,0))
ans+=f[1][j<<1][k<<1],ans%=1000000007;
for(int i=3;i<=n;++i){
for(int l=0;l<(1<<m);++l)
for(int k=1;k<(1<<m);++k)
for(int j=1;j<(1<<m);++j)
if(judge(j<<1,k<<1,l<<1))
f[2][j<<1][k<<1]+=f[1][k<<1][l<<1];
for(int j=1;j<(1<<m);++j)
for(int k=1;k<(1<<m);++k)
if(judge(j<<1,k<<1,0))
ans+=f[2][j<<1][k<<1],ans%=1000000007;
memcpy(f[0],f[1],sizeof(f[0]));
memcpy(f[1],f[2],sizeof(f[1]));
memset(f[2],0,sizeof(f[2]));
}
cout<<ans;
return 0;
}