#include<bits/stdc++.h>usingnamespace std;inlinevoidread(int&num){char ch;int flg =1;while(!isdigit(ch=getchar()))if(ch=='-')flg =-flg;for(num=0;isdigit(ch); num=num*10+ch-'0', ch=getchar()); num*=flg;}constint MAXN =1e5+5;constint mod =1e9+7;struct mat {int a[3][3];mat(){memset(a,0,sizeof a);}inlinevoidinit1(){
a[0][0]=2; a[0][1]=2; a[0][2]=1;
a[1][0]=1; a[1][1]=1; a[1][2]=0;
a[2][0]=1; a[2][1]=2; a[2][2]=1;}inlinevoidinit2(){
a[0][0]=1; a[0][1]=0; a[0][2]=0;
a[1][0]=1; a[1][1]=1; a[1][2]=0;
a[2][0]=1; a[2][1]=2; a[2][2]=1;}inline mat operator*(const mat &o)const{
mat re;for(int k =0; k <3;++k)for(int i =0; i <3;++i)if(a[i][k])for(int j =0; j <3;++j)if(o.a[k][j])
re.a[i][j]=(re.a[i][j]+1ll* a[i][k]* o.a[k][j]% mod)% mod;return re;}inline mat operator^(int b)const{
mat A =*this, re;
re.a[0][0]= re.a[1][1]= re.a[2][2]=1;while(b){if(b &1) re = re * A;
A = A * A; b >>=1;}return re;}}ans, trans1, trans2;int N, M, pos[MAXN];intmain(){freopen("count.in","r",stdin);freopen("count.out","w",stdout);scanf("%d%d",&N,&M);for(int i =1; i <= M;++i)scanf("%d",&pos[i]);
ans.a[0][0]=1;
trans1.init1();
trans2.init2();for(int i =1; i <= M;++i)
ans =(trans1^(pos[i]-pos[i-1]-1))* ans, ans = trans2 * ans;
ans =(trans1^(N-pos[M]))* ans;printf("%d\n", ans.a[2][0]);}