#pragma region
#ifndef M207
#pragma GCC optimize("O2,Ofast,inline,unroll-all-loops,-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,popcnt")
#endif
#include <bits/stdc++.h>
using namespace std;
#define ri register int
#define il inline
#define LL long long
#define uint unsigned int
#define ull unsigned long long
#define solid const auto &
#define pb emplace_back
#define mp make_pair
#define pii pair<int,int>
#define pll pair<LL,LL>
#define fi first
#define se second
#define gm int mid((l+r)/2)
#define space putchar(' ')
#define enter putchar('\n')
#define rd() ({ri t;in(t);t;})
#define Size(x) ((int)x.size())
#define mem(x,y) memset(x,y,sizeof(x))
template<class T>il void in(T &x)
{
	x=0; char c=getchar(); bool f=0;
	while(!isdigit(c)) f|=(c=='-'),c=getchar();
	while(isdigit(c)) x=x*10+(c^'0'),c=getchar();
	f?x=-x:0;
}
template<class T>il void out(T x,const char c='\n')
{
	static short st[30]; short m=0;
	if(x<0) putchar('-'),x=-x;
	do st[++m]=x%10,x/=10; while(x);
	while(m) putchar(st[m--]|'0');
	putchar(c);
}
template<class T>il void err(const T &x,const char c='\n') {cerr<<x<<c;}
template<class T,class ...Args>il void in(T &x,Args &...args) {in(x); in(args...);}
template<class T,class ...Args>il void out(const T &x,const Args &...args) {out(x,' '); out(args...);}
template<class T,class ...Args>il void err(const T &x,const Args &...args) {err(x,' '); err(args...);}
template<class T>il void prt(T a[],int n) {for(ri i=0; i<n; ++i) out(a[i],i==n-1?'\n':' ');}
template<class T>il void clr(T a[],int n) {memset(a,0,sizeof(T)*n);}
template<class T>il void clr(T *a,T *b) {memset(a,0,sizeof(T)*(b-a));}
template<class T>il bool ckmax(T &a,const T &b) {return a<b?a=b,1:0;}
template<class T>il bool ckmin(T &a,const T &b) {return a>b?a=b,1:0;}
namespace MOD_CALC
{
const int md=1e9+7,inv2=(md+1)/2;
il int add(const int a,const int b) {return a+b>=md?a+b-md:a+b;}
il int sub(const int a,const int b) {return a-b<0?a-b+md:a-b;}
il int mul(const int a,const int b) {return (LL)a*b%md;}
il void inc(int &a,const int b) {(a+=b)>=md?a-=md:0;}
il void dec(int &a,const int b) {(a-=b)<0?a+=md:0;}
il int qpow(int a,int b) {int r=1; for(; b; b>>=1,a=mul(a,a)) if(b&1) r=mul(r,a); return r;}
il int qpow(int a,int b,const int p) {int r=1; for(; b; b>>=1,a=(LL)a*a%p) if(b&1) r=(LL)r*a%p; return r;}
il int mdinv(const int a) {return qpow(a,md-2);}
template<class ...Args>il int add(const int a,const int b,const Args &...args) {return add(add(a,b),args...);}
template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
} using namespace MOD_CALC;
namespace i207M
{
#pragma endregion
#define N 100005
// void test(int n)
// {
// 	static int w[N],f[N],g[N],h[N];
// 	w[0]=1;
// 	for(ri i=1; i<=n; ++i)
// 	{
// 		for(ri j=1; j<=i; ++j)
// 			inc(w[i],mul(w[i-j],j,j));
// 	}
// 	h[0]=1;
// 	for(ri i=1; i<=n; ++i)
// 	{
// 		f[i]=add(f[i-1],f[i-1],g[i-1],g[i-1],h[i-1]);
// 		g[i]=add(f[i-1],g[i-1],h[i-1]);
// 		h[i]=add(f[i-1],h[i-1]);
// 	}
// 	for(ri i=1; i<=n; ++i) out(i,w[i]);
// }
struct Mat
{
	int m[3][3];
	il int *operator[](const int x) {return m[x];}
	il const int *operator[](const int x) const {return m[x];}
	friend Mat operator*(const Mat &a,const Mat &b)
	{
		Mat c; mem(c.m,0);
		for(ri i=0; i<3; ++i)
			for(ri k=0; k<3; ++k)
				for(ri j=0; j<3; ++j)
					inc(c[i][j],mul(a[i][k],b[k][j]));
		return c;
	}
	friend Mat operator*(Mat a,const int v)
	{
		for(ri i=0; i<3; ++i)
			for(ri j=0; j<3; ++j)
				a[i][j]=mul(a[i][j],v);
		return a;
	}
	il void operator+=(const Mat &v)
	{
		for(ri i=0; i<3; ++i)
			for(ri j=0; j<3; ++j)
				inc(m[i][j],v[i][j]);
	}
	il void operator-=(const Mat &v)
	{
		for(ri i=0; i<3; ++i)
			for(ri j=0; j<3; ++j)
				dec(m[i][j],v[i][j]);
	}
	il void print()
	{
		for(ri i=0; i<3; ++i) prt(m[i],3);
	}
};
Mat qpow(Mat a,int b)
{
	Mat res; mem(res.m,0);
	for(ri i=0; i<3; ++i) res[i][i]=1;
	for(; b; b>>=1,a=a*a) if(b&1) res=res*a;
	return res;
}
Mat zy,ni,sum;
il int func(int x)
{
	return qpow(zy,x)[2][0];
}
int n,m;
int pos[N];
// int dp[N];
signed main()
{
#ifdef M207
	freopen("in.in","r",stdin);
	// freopen("ot.out","w",stdout);
#endif
	// test(20);
	zy[0][0]=zy[1][0]=2,zy[0][1]=zy[0][2]=zy[1][1]=zy[2][0]=zy[2][1]=zy[2][2]=1;
	ni[0][0]=ni[2][0]=ni[1][1]=1,ni[0][2]=ni[2][1]=md-1,ni[1][0]=md-2,ni[1][2]=2;
	in(n,m);
	for(ri i=1; i<=m; ++i) in(pos[i]);
	pos[m+1]=n;
	for(ri i=1; i<=m+1; ++i)
	{
		Mat t=qpow(zy,pos[i]);
		t-=t*sum;
		// out(i,pos[i]);
		// t.print();
		if(i<=m) sum+=qpow(ni,pos[i])*t[2][0];
		else sum=t;
		// sum.print();
		// dp[i]=func(pos[i]);
		// for(ri j=1; j<i; ++j) dec(dp[i],mul(dp[j],func(pos[i]-pos[j])));
	}
	int ans=sum[2][0];
	out(ans);
	return 0;
}
#pragma region
}
signed main()
{
	i207M::main();
	return 0;
}
#pragma endregion


Measured memory_bytes: 640