#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXM 100000
#define MO 1000000007
using namespace std;
struct Matrix
{
	int M[4][4];
	Matrix operator * (const Matrix &b)
	{
		Matrix ret;
		for(int i=1;i<=3;i++)
			for(int j=1;j<=3;j++)
			{
				ret.M[i][j]=0;
				for(int k=1;k<=3;k++)
					ret.M[i][j]=(1LL*ret.M[i][j]+1LL*M[i][k]*b.M[k][j]%MO)%MO;
			}
		return ret;
	}
};
int x[MAXM+5],N,M;
int finans[4],d[4];
Matrix PowMod(Matrix a,int b)
{
	Matrix ret;
	for(int i=1;i<=3;i++)
		for(int j=1;j<=3;j++)
		{
			if(i==j)
				ret.M[i][j]=1;
			else
				ret.M[i][j]=0;
		}
	while(b)
	{
		if(b&1)
			ret=ret*a;
		a=a*a;
		b>>=1;
	}
	return ret;
}
void SPMul(Matrix ans)
{
	memset(finans,0,sizeof(finans));
	for(int j=1;j<=3;j++)
		for(int k=1;k<=3;k++)
			finans[j]=(1LL*finans[j]+1LL*ans.M[j][k]*d[k]%MO)%MO;
	d[1]=finans[1],d[2]=finans[2],d[3]=finans[3];
}
int main()
{
	scanf("%d %d",&N,&M);
	for(int i=1;i<=M;i++)
		scanf("%d",&x[i]),x[i]++;
	sort(x+1,x+1+M);
	Matrix ans,usu,ususpe;
	//===========================================
	usu.M[1][1]=1,usu.M[1][2]=0,usu.M[1][3]=0;
	usu.M[2][1]=1,usu.M[2][2]=1,usu.M[2][3]=0;
	usu.M[3][1]=1,usu.M[3][2]=2,usu.M[3][3]=1;
	//===========================================
	ususpe.M[1][1]=1,ususpe.M[1][2]=0,ususpe.M[1][3]=1;
	ususpe.M[2][1]=1,ususpe.M[2][2]=1,ususpe.M[2][3]=1;
	ususpe.M[3][1]=1,ususpe.M[3][2]=2,ususpe.M[3][3]=2;
	//===========================================
	d[1]=d[2]=d[3]=1;
	int pre=1;
	for(int i=1;i<=M;i++)
	{
		ans=PowMod(ususpe,x[i]-pre-1);
		SPMul(ans);
		ans=usu;
		SPMul(ans);
		pre=x[i];
	}
	ans=PowMod(ususpe,N-pre);
	SPMul(ans);
	printf("%d\n",d[3]);
	return 0;
}