#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int maxm=100050;
const int mod=1e9+7;
struct nod{
	int a[4][4];
	inline void clear(){
		memset(a,0,sizeof(a));
	}
	inline void st1(){
		clear();
		a[0][0]=a[0][2]=a[1][1]=a[2][2]=1;
		a[1][2]=1;
		a[0][1]=2;
	}
	inline void st(){
		clear();
		a[0][0]=a[0][2]=a[1][1]=a[1][2]=1;
		a[2][0]=1;
		a[2][1]=a[2][2]=a[0][1]=2;
	}
};
int n,m;
int x[maxm];
nod ans,tmp;
inline nod operator * (nod x,nod y){
	nod c;
	c.clear();
	for(register int i=0;i<3;i++){
		for(register int j=0;j<3;j++){
			for(register int k=0;k<3;k++){
				c.a[i][j]=(c.a[i][j]+((ll)x.a[i][k]*(ll)y.a[k][j])%mod)%mod;
			}
		}
	}
	return c;
}
inline nod ksm(nod a,int x){
	nod cheng;
	cheng.st();
	int st[50],top=0;
	while(x){
		st[++top]=x&1;
		x>>=1;
	}
	while(top){
		a=a*a;
		if(st[top--]){
			a=a*cheng;
		}
		x>>=1;
	}
	return a;
}
int main(){
	tmp.st1();
	ans.clear();
	ans.a[0][0]=ans.a[0][2]=1;
	ans.a[0][1]=2;
	scanf("%d%d",&n,&m);
	for(register int i=1;i<=m;i++)scanf("%d",&x[i]);
	x[++m]=n;
	//cout<<ans.a[0][0]<<' '<<ans.a[0][1]<<' '<<ans.a[0][2]<<endl;
	for(register int i=1;i<=m;i++){
		int dis=x[i]-(x[i-1]+1);
		nod fuck;
		fuck.clear();
		fuck.a[0][0]=fuck.a[1][1]=fuck.a[2][2]=1;
		fuck=ksm(fuck,dis);
		// for(register int j=0;j<3;j++){
		// 	for(register int k=0;k<3;k++){
		// 		cout<<fuck.a[j][k]<<' ';
		// 	}
		// 	cout<<endl;
		// }
		ans=ans*fuck;
		//cout<<x[i]-(x[i-1]+1)<<' '<<ans.a[0][0]<<' '<<ans.a[0][1]<<' '<<ans.a[0][2]<<endl;
		if(i!=m)ans=ans*tmp;
	}
	printf("%d\n",ans.a[0][2]);
}