#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 100010
#define MOD 1000000007
#define LL long long
int x[N],n,m;
bool vis[N];
struct node
{
	LL a[3][3];
}A,C,a,b,c,tmp;
int f[3],g[3];
node Mul(node res,node X,node Y)
{
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			tmp.a[i][j]=0;
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			for(int k=0;k<3;k++)
				tmp.a[i][j]=(tmp.a[i][j]+X.a[i][k]*Y.a[k][j]%MOD)%MOD;
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			res.a[i][j]=tmp.a[i][j];
	return res;
}
void Pow(int X)
{
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			c.a[i][j]=C.a[i][j];
	while(X)
	{
		if(X&1) a=Mul(a,a,c);
		c=Mul(c,c,c);
		X>>=1;
	}
}
int main()
{
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++)
		scanf("%d",&x[i]);
	memset(A.a,0,sizeof(A.a));
	memset(C.a,0,sizeof(C.a));
	A.a[0][0]=A.a[1][1]=A.a[2][2]=A.a[1][2]=A.a[0][2]=1;
	A.a[0][1]=2;
	C.a[0][2]=C.a[1][0]=C.a[1][1]=C.a[1][2]=C.a[2][0]=C.a[2][2]=1;
	C.a[0][0]=C.a[0][1]=2;
	f[0]=1;
	x[++m]=n;
	for(int l=1,pos=0;l<=m;l++)
	{
		int k=x[l]-pos-1;
		memset(b.a,0,sizeof(b.a));
		memset(a.a,0,sizeof(a.a));
		for(int i=0;i<3;i++)
			a.a[i][i]=1;
		if(k) Pow(k);
		b=Mul(b,a,A);
		for(int i=0;i<3;i++)
		{
			g[i]=0;
			for(int j=0;j<3;j++)
				g[i]=(g[i]+f[j]*b.a[j][i]%MOD)%MOD;
		}
		for(int i=0;i<3;i++)
			f[i]=g[i];
		pos=x[l];
	}
	printf("%d\n",f[2]);
}
