#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define p 1000000007
using namespace std;
namespace ywy{
	typedef struct _mx{
		ll v[3][3];_mx(){memset(v,0,sizeof(v));}
		friend _mx operator *(const _mx &a,const _mx &b){
			_mx c;for(register int i=0;i<3;i++){
				for(register int k=0;k<3;k++){
					for(register int j=0;j<3;j++)c.v[i][j]=(c.v[i][j]+a.v[i][k]*b.v[k][j])%p;
				}
			}return(c);
		}
	}mx;
	inline mx mi(mx a,int b){
		mx ans,tmp=a;ans.v[0][0]=ans.v[1][1]=ans.v[2][2]=1;while(b){
			if(b&1)ans=ans*tmp;tmp=tmp*tmp;b>>=1;
		}return(ans);
	}int ints[1000001];ll f[120001],fx[120001],fx2[120001];
	void ywymain(){
		f[0]=1;int n,m;cin>>n>>m;mx dk;dk.v[0][0]=2;dk.v[0][1]=dk.v[0][2]=1;
		dk.v[1][0]=2;dk.v[1][1]=1;dk.v[1][2]=2;dk.v[2][0]=1;dk.v[2][2]=1;
		for(register int i=1;i<=m;i++){
			cin>>ints[i];mx cjr=mi(dk,ints[i]-ints[i-1]-1);
			ll df=(f[i-1]*cjr.v[0][0]+fx[i-1]*cjr.v[1][0]+fx2[i-1]*cjr.v[2][0])%p;
			ll dfx=(f[i-1]*cjr.v[0][1]+fx[i-1]*cjr.v[1][1]+fx2[i-1]*cjr.v[2][1])%p;
			ll dfx2=(f[i-1]*cjr.v[0][2]+fx[i-1]*cjr.v[1][2]+fx2[i-1]*cjr.v[2][2])%p;
			f[i]=df;fx[i]=(dfx+df)%p;fx2[i]=(dfx2+2*dfx+df)%p;
		}mx cjr=mi(dk,n-ints[m]),ywy=mi(dk,n-ints[m]-1);
		ll df0=(f[m]*ywy.v[0][0]+fx[m]*ywy.v[1][0]+fx2[m]*ywy.v[2][0])%p;
		ll df1=(f[m]*cjr.v[0][0]+fx[m]*cjr.v[1][0]+fx2[m]*cjr.v[2][0])%p;
		cout<<(df1-df0+p)%p<<endl;
	}
}
int main(){
	ywy::ywymain();return(0);
}