#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#define LL long long
#define LD long double
using namespace std;
const int NN=25000 +117;
const int MM=417;
int read(){
	int fl=1,x;char c;
	for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());
	if(c=='-'){fl=-1;c=getchar();}
	for(x=0;c>='0'&&c<='9';c=getchar())
		x=(x<<3)+(x<<1)+c-'0';
	return x*fl;
}
void open(){
	freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout);
}
void close(){
	fclose(stdin);
	fclose(stdout);
}

const int mod=1e9+7;
int m,n,k;
LL pre[NN][MM]={};
LL suf[NN][MM]={};
int a[NN]={};
LL ksm(LL a,LL b){
	LL ret=1;
	for(;b;b>>=1,a=a*a%mod)
		if(b&1)ret=ret*a%mod;
	return ret;
}
LL getfact(int n){
	LL ret=1;
	for(int i=1;i<=n;++i)ret=ret*i%mod;
	return ret;
}
int t[NN]={};
int getlas(){
	int pos=1;
	for(int i=1;i<=k;++i)t[i]=0;
	for(int i=1;i<=m;++i){
		++t[a[i]];
		if(t[a[i]]==2){
			while(a[pos]!=a[i]){
				t[a[pos]]--;
				++pos;
			}
			t[a[pos]]--;
			++pos;
		}
		if(i-pos+1==k)return k;
	}
	return m+1-pos;
}
int main(){
	//open();
	n=read();
	k=read();
	m=read();
	LL ans=0;
	for(int i=1;i<=m;++i){
		a[i]=read();
	}
	int tp=getlas();
	ans=ksm(k,n-m)*(n-m+1)%mod;
	if(tp==k){
		ans-=0;
		
	}
	else if(tp!=m){
	pre[0][tp]=1;
	for(int i=0;i<n-m;++i){
		for(int j=1;j<k;++j){
			pre[i+1][1]+=pre[i][j];
			pre[i+1][j+1]+=(k-j-1)*pre[i][j]%mod;
			pre[i+1][j+2]-=(k-j)*pre[i][j]%mod;
		}
		for(int j=2;j<k;++j){
			pre[i+1][j]+=pre[i+1][j-1];
			pre[i+1][j]%=mod;
		}
	}
	for(int i=1;i<=m/2;++i){
		swap(a[i],a[m+1-i]);
	}
	tp=getlas();
	suf[0][tp]=1;
	for(int i=0;i<n-m;++i){
		for(int j=1;j<k;++j){
			suf[i+1][1]+=suf[i][j];
			suf[i+1][j+1]+=(k-j-1)*suf[i][j]%mod;
			suf[i+1][j+2]-=(k-j)*suf[i][j]%mod;
		}
		for(int j=2;j<k;++j){
			suf[i+1][j]+=suf[i+1][j-1];
			suf[i+1][j]%=mod;
		}
	}
	for(int i=0;i<=n-m;++i){
		int a=i,b=n-m-i;
		LL sa=0,sb=0;
		for(int j=1;j<k;++j){
			sa=(sa+pre[a][j])%mod;
			sb=(sb+suf[b][j])%mod;
		}
		ans-=sa*sb%mod;
		ans%=mod;
	}
	}
	else{
		suf[1][1]=k;
		pre[1][1]=(m==1?k:0);
		for(int i=1;i<n;++i){
			for(int j=1;j<k;++j){
				suf[i+1][1]+=suf[i][j];
				suf[i+1][j+1]+=(k-j-1)*suf[i][j]%mod;
				suf[i+1][j+2]-=(k-j)*suf[i][j]%mod;
				pre[i+1][1]+=pre[i][j];
				pre[i+1][j+1]+=(k-j-1)*pre[i][j]%mod;
				pre[i+1][j+2]-=(k-j)*pre[i][j]%mod;
			}
			for(int j=2;j<k;++j){
				suf[i+1][j]+=suf[i+1][j-1];
				suf[i+1][j]%=mod;
				pre[i+1][j]+=pre[i+1][j-1];
				pre[i+1][j]%=mod;
			}
			for(int j=m;j<k;++j){
				pre[i+1][j]+=suf[i+1][j];
				pre[i+1][j]%=mod;
			}
		}
		LL tp=0;
		for(int j=1;j<k;++j){
			tp+=pre[n][j];
			tp%=mod;
		}
		tp=tp*getfact(k-m)%mod*ksm(getfact(k),mod-2)%mod;
		ans=(ans-tp)%mod;
	}
	ans=(ans+mod)%mod;
	printf("%lld\n",ans);
	close();
	return 0;
}