//</></>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</></>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> </>//</> <
#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 ff          first
#define ss          second
#define pb          push_back
#define mp          make_pair
#define pii         pair<int,int>
#define vi          vector <int>
#define mii         map <int,int>
#define mxhi        priority_queue<int>
#define mnhi        priority_queue<int,vi,greater<int> >
#define mod         1000000007
#define setbits(x)  __builtin_popcountll(x)
#define zrobits(x)  __builtin_ctzll(x)   //no of zero bits befor the first set bits
#define inf         1e18
#define ps(x,y)     fixed<<setprecision(y)<<x
#define w(x)        int x; cin>>x; while(x--)
#define int         long long
vector<int> pn;
template<typename T>
class graph
{
    map<T,list<T> > l;
public:
    void addedge(T x,T y)
    {

        l[x].push_back(y);
        l[y].push_back(x);
    }
    void dfs_helper(T src,map <T,bool> &visited,int count=0)   // passing bby address is necessary like 1
    {

        cout<<src<<" ";
        visited[src]=true;
        bool ikv=false;
        for(auto x:l[src])
        {

            if(visited[x]==0)
            {  ikv=true;

                dfs_helper(x,visited,count+1);
            }
        }

            
    }

    void dfs(T src)
    {



        map<T,bool> visited;
        for(auto x:l)
        {

            visited[x.first]=false;

        }
        dfs_helper(src,visited);


    }
    void bfs(T src)
    {
        queue <T> q;
        map<T,int> m;
        for(auto x:l)
        {

            m[x.first]=INT_MAX;
        }
        q.push(src);
        m[src]=0;
        while(!q.empty())
        {

            T top=q.front();
            q.pop();
          //  cout<<top<<" ";
            for(auto nbr:l[top])
            {
                if(m[nbr]==INT_MAX)
                {

                    q.push(nbr);
                    m[nbr]=m[top]+1;
                }

            }
        }
                

    }
void print()
    {

        for(auto p:l)
        {

            cout<<p.first<<"-> ";
            for(auto nbr:l.second)
            {

                cout<<nbr<<" ";
            }
            cout<<endl;
        }
    }


};
// void calncr()
// {
//      for(int n = 0 ; n <= 2000 ; ++n){
//         for(int r = 0 ; r <= n ;++r){
//             if(n==r){
//                 C[n][r] = 1; 
//             }
//             else if(r == 0){
//                 C[n][r] = 1 ; 
//             }
//             else if(r == 1){
//                 C[n][r] = n; 
//             }
//             else{
//                 C[n][r] = C[n-1][r] + C[n-1][r-1] ; 
//             }
//          //   if(n<=10 and r <= 10)
//           //  cout << n << " " << r << " " << C[n][r] << "\n" ; 
//         }
//     }
// }
void SieveOfEratosthenes(int n) 
{   bool prime[n+1]; 
    memset(prime, true, sizeof(prime)); 
  
    for (int p=2; p*p<=n; p++) 
    { 
        
        if (prime[p] == true) 
        { 
         
        for (int i=p*p; i<=n; i += p) 
                prime[i] = false; 
        } 
    } 
    for (int p=2; p<=n; p++) 
       if (prime[p]) 
         pn.pb(p);
} 
int fp(int a,int n)
{
    int ans=1;
    while(n>0)
    {
        bool lb=n&1;
        if(lb)
            ans=(ans*a);
        a=(a*a);
        n=n>>1;
    }
    return ans;
}
typedef tree<int,null_type,less<int>,rb_tree_tag,
        tree_order_statistics_node_update>
        PBDS;
void i_n()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    #ifndef ONLINE_JUDGE
            freopen("input.txt","r",stdin);
            freopen("output.txt","w",stdout);
    #endif
}
int n,m;
int dp[200000][2];
int cal(int i,int pv)
{
	if(i>=m)
		return 1;
	if(dp[i][pv]!=-1)
		return dp[i][pv];
	int ans=0;
	if(pv==0)
	{
		ans+=cal(i+1,1)%mod;
		ans+=cal(i+1,0)%mod;
	}
	else
		ans+=cal(i+1,0)%mod;
	ans%=mod;
	return dp[i][pv]=ans;
}
void solve()
{
   cin>>n>>m;
   memset(dp,-1,sizeof dp);
   int ans=1;
   if(n==1)
   	ans--;
   ans+=cal(1,0);
   ans%=mod;
   ans=(2*ans)%mod;
   cout<<ans<<endl;

}
main()
{
    i_n();
    solve();
    

}
