// Slower C++ solution:
#include<map>

#include<set>

#include<stack>

#include<queue>

#include<cmath>

#include<cstring>

#include<climits>

#include<cstdio>

#include<iostream>

#include<algorithm>

using namespace std;

#define LL long long

//#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)

//char buf[(1 << 21) + 1], *p1 = buf, *p2 = buf;

inline int read() {

	bool f=0;int x=0;char c=getchar();

	while(c<'0'||'9'<c){if(c==EOF)exit(0);if(c=='-')f=1;c=getchar();}

	while('0'<=c&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();

	return !f?x:-x;

}

#define MAXN 100000

#define INF 0x3f3f3f3f

#define Mod (int)(1e9+7)

struct Matrix{

	#define MAXC 4

	int r,c;

	LL m[MAXC+5][MAXC+5];

	void Init(int R,int C){

		r=R,c=C;

		for(int i=0;i<r;i++)

			for(int j=0;j<c;j++)

				m[i][j]=0;

		return ;

	}

	friend Matrix operator * (Matrix A,Matrix B){

		Matrix C;C.Init(A.r,B.c);

		for(int i=0;i<A.r;i++)

			for(int j=0;j<B.c;j++)

				for(int k=0;k<A.c;k++)

					C.m[i][j]=(C.m[i][j]+A.m[i][k]*B.m[k][j])%Mod;

		return C;

	}

	void Print(){

		puts("");

		for(int i=0;i<r;i++,puts(""))

			for(int j=0;j<c;j++)

				printf("%lld ",m[i][j]);

		puts("");

		return ;

	}

};

Matrix Pow(Matrix x,int y){

	Matrix ret;ret.Init(x.r,x.c);

	for(int i=0;i<ret.r;i++)

		ret.m[i][i]=1;

	while(y){

		if(y&1) ret=ret*x;

		x=x*x,y>>=1;

	}

	return ret;

}

Matrix A,B,C;

void Init(){

	A.Init(1,3),A.m[0][0]=1,A.m[0][1]=2,A.m[0][2]=1;

	B.Init(3,3);

	B.m[0][0]=1,B.m[0][1]=2,B.m[0][2]=1,

	B.m[1][0]=0,B.m[1][1]=1,B.m[1][2]=1,

	B.m[2][0]=1,B.m[2][1]=2,B.m[2][2]=2;

	C.Init(3,3);

	C.m[0][0]=1,C.m[0][1]=2,C.m[0][2]=1,

	C.m[1][0]=0,C.m[1][1]=1,C.m[1][2]=1,

	C.m[2][0]=0,C.m[2][1]=0,C.m[2][2]=1;

	return ;

}

int main(){

	int n=read(),m=read();

	Init();

	int lst=1;

	for(int i=1;i<=m;i++){

		int x=read();

		A=A*Pow(B,x-lst);

		A=A*C;

		lst=x+1;

	}

	A=A*Pow(B,n-lst);

	printf("%lld\n",A.m[0][2]);

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.005205417472684x):
#include<cstdio>

#include<algorithm>

#include<cstring>

using namespace std;

#define MAXN 100010

#define MO 1000000007

#define LL long long

int x[MAXN],n,m;

bool vis[MAXN];

void task1()

{

	static int dp[100010][3];

	dp[0][0]=1;

	for(int i=1;i<=m;i++)

		vis[x[i]]=1;

	for(int i=1;i<=n;i++)

	{

		dp[i][0]=dp[i-1][0];

		dp[i][1]=(dp[i-1][0]+dp[i-1][1])%MO;

		dp[i][2]=((dp[i-1][0]+dp[i-1][1])%MO+(dp[i-1][1]+dp[i-1][2])%MO)%MO;

		if(!vis[i-1])

		{

			dp[i][0]=(dp[i][0]+dp[i-1][2])%MO;

			dp[i][1]=(dp[i][1]+dp[i-1][2])%MO;

			dp[i][2]=(dp[i][2]+dp[i-1][2])%MO;

		}

	}

	printf("%d\n",dp[n][2]);

}

struct node

{

	LL a[3][3];

}A,C,a,b,c,tmp;

void Mul(node &ret,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]%MO)%MO;

	for(int i=0;i<3;i++)

		for(int j=0;j<3;j++)

			ret.a[i][j]=tmp.a[i][j];

}

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) Mul(a,a,c);

		Mul(c,c,c);

		X>>=1;

	}

}

int f[3],g[3];

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);

		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]%MO)%MO;

		}

		for(int i=0;i<3;i++)

			f[i]=g[i];

		pos=x[l];

	}

	printf("%d\n",f[2]);

}