#include <cstdio>
#include <cstring>
using namespace std;
const int N=25010,K=410;
const int MOD=1e9+7;
int n,o,m; // o=k
int a[N];
void readData(){
	scanf("%d%d%d",&n,&o,&m);
	for(int i=1;i<=m;i++) scanf("%d",&a[i]);
}
int fastPow(int x,int y){
	int res=1;
	for(;y;x=1ll*x*x%MOD,y>>=1)
		if(y&1)
			res=1ll*res*x%MOD;
	return res;
}
int getType(){
	static int sum[K];
	int haveCnt=0;
	for(int i=1;i<=m;i++){
		if(!sum[a[i]])
			haveCnt++;
		sum[a[i]]++;
		if(i-o>0){
			if(sum[a[i-o]]==1)
				haveCnt--;
			sum[a[i-o]]--;
		}
		if(haveCnt==o)
			return 0;
	}
	for(int i=1;i<=o;i++) sum[i]=0;
	for(int i=1;i<=m;i++){
		if(sum[a[i]])
			return 2;
		sum[a[i]]++;
	}
	return 1;
}
int dp(){
	static int f[N][K],g[N][K];
	f[0][0]=1;
	for(int i=1;i<=n;i++){
		for(int j=o-1;j>=1;j--){
			if(j){
				(f[i][j]+=1ll*(f[i-1][j-1]-f[i-1][j])%MOD*(o-(j-1))%MOD)%=MOD;
				(g[i][j]+=1ll*(g[i-1][j-1]-g[i-1][j])%MOD*(o-(j-1))%MOD)%=MOD;
			}
			(f[i][j]+=f[i-1][j])%=MOD;
			(g[i][j]+=g[i-1][j])%=MOD;
			if(j>=m)
				(g[i][j]+=f[i][j])%=MOD;
			(f[i][j]+=f[i][j+1])%=MOD;
			(g[i][j]+=g[i][j+1])%=MOD;
		}
		f[i][0]=f[i][1];
		g[i][0]=g[i][1];
	}
	return g[n][0];
}
int calcDistinct(){
	int div=1;
	for(int i=o;i>o-m;i--)
		div=1ll*div*i%MOD;
	return 1ll*dp()*fastPow(div,MOD-2)%MOD;
}
void dp(int f[][K],int up,int ready){
	f[0][ready]=1;
	for(int j=o-2;j>=1;j--) (f[0][j]+=f[0][j+1])%=MOD;
	for(int i=1;i<=up;i++){
		for(int j=o-1;j>=1;j--){
			if(j>1)
				(f[i][j]+=1ll*(f[i-1][j-1]-f[i-1][j])%MOD*(o-(j-1))%MOD)%=MOD;
			(f[i][j]+=f[i-1][j])%=MOD;
			(f[i][j]+=f[i][j+1])%=MOD;
		}
	}
}
int calcAppend(){
	static bool exist[K];
	int l,r;
	for(l=1;l<=m&&!exist[a[l]];l++)
		exist[a[l]]=true;
	l--;
	memset(exist,0,sizeof exist);
	for(r=m;r>=1&&!exist[a[r]];r--)
		exist[a[r]]=true;
	r++;
	static int f1[N][K],f2[N][K];
	dp(f1,n-m,l);
	dp(f2,n-m,m-r+1);
	int res=0;
	for(int i=0;i<=n-m;i++)
		(res+=1ll*f1[i][1]*f2[n-m-i][1]%MOD)%=MOD;
	return res;
}
void solve(){
	int ans=1ll*(n-m+1)*fastPow(o,n-m)%MOD;
	int type=getType();
	if(type==1)
		(ans-=calcDistinct())%=MOD;
	else if(type==2)
		(ans-=calcAppend())%=MOD;
	printf("%d\n",ans>=0?ans:ans+MOD);
}
int main(){
	readData();
	solve();
	return 0;
}
