/* --- author: dxm --- */
#include<bits/stdc++.h>
using namespace std;

#define INF 1e9
#define Inf 1e18
#define rep(i,n) for(int (i)=0;(i)<n;i++)
#define REP(i,n) for(int (i)=1;(i)<=n;i++)
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define fst first
#define snd second
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef unsigned int uint;
typedef unsigned long long ull;
#define DEBUG

const int maxn=25005;
const int maxm=405;
const int mod=1e9+7;
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
inline int sub(int a,int b){return a-b<0?a-b+mod:a-b;}
inline int mul(int a,int b){return 1LL*a*b%mod;}
int N,M,K;
int a[maxn];
bool occ[maxm];
int dp[maxn][maxm][2][2],sum[maxn][maxm][2];
int f[maxn][maxm],g[maxn][maxm];
int C[maxm][maxm];

int quick_pow(int x,int pow){
	int res=1;
	for(;pow;pow>>=1){
		if(pow&1)res=mul(res,x);
		x=mul(x,x);
	}
	return res;
}

int main(){
#ifndef DEBUG
	freopen("my.in","r",stdin);
	freopen("my.out","w",stdout);
#endif
	scanf("%d%d%d",&N,&K,&M);
	rep(i,K+1)C[i][0]=1;
	REP(i,K)REP(j,K)C[i][j]=add(C[i-1][j-1],C[i-1][j]);
	REP(i,M)scanf("%d",&a[i]);
	REP(i,M-K+1){
		bool ok=true;
		REP(j,K)occ[j]=false;
		rep(j,K)occ[a[i+j]]=true;
		REP(j,K)if(!occ[j])ok=false;
		if(ok){
			printf("%d",mul(N-M+1,quick_pow(K,N-M)));
			return 0;
		}
	} 
	int x=M,y=M;
	memset(occ,false,sizeof(occ));
	REP(i,M){
		if(occ[a[i]]){x=i-1;break;}
		else occ[a[i]]=true;
	}
	memset(occ,false,sizeof(occ));
	for(int i=M;i>=1;i--){
		if(occ[a[i]]){y=M-i;break;}
		else occ[a[i]]=true;
	}
	if(x!=M){
		dp[0][x][0][0]=1;for(int i=x;i<=K;i++)sum[0][i][0]=1;
		REP(i,N)REP(j,K)rep(k,2){
			if(j==K&&!k)goto end;
			dp[i][j][k][0]=sub(sum[i-1][K][k],sum[i-1][j-1][k]);
			dp[i][j][k][0]=add(dp[i][j][k][0],mul(K-j+1,dp[i-1][j-1][k][0]));
			if(j==K){
				dp[i][j][k][0]=add(dp[i][j][k][0],sub(sum[i-1][K][0],sum[i-1][j-1][0]));
				dp[i][j][k][0]=add(dp[i][j][k][0],mul(K-j+1,dp[i-1][j-1][0][0]));
			}
			end:
			sum[i][j][k]=add(sum[i][j-1][k],dp[i][j][k][0]);
		}
		memset(sum,0,sizeof(sum));
		dp[0][y][0][1]=1;for(int i=y;i<=K;i++)sum[0][i][0]=1;
		REP(i,N)REP(j,K)rep(k,2){
			if(j==K&&!k)goto end2;
			dp[i][j][k][1]=sub(sum[i-1][K][k],sum[i-1][j-1][k]);
			dp[i][j][k][1]=add(dp[i][j][k][1],mul(K-j+1,dp[i-1][j-1][k][1]));
			if(j==K){
				dp[i][j][k][1]=add(dp[i][j][k][1],sub(sum[i-1][K][0],sum[i-1][j-1][0]));
				dp[i][j][k][1]=add(dp[i][j][k][1],mul(K-j+1,dp[i-1][j-1][0][1]));
			}
			end2:
			sum[i][j][k]=add(sum[i][j-1][k],dp[i][j][k][1]);
		}
		int ans=0;
		rep(i,N-M+1){
			int j=N-M-i;
			int L=0,R=0;
			REP(k,K){
				L=add(L,dp[i][k][1][0]);
				R=add(R,dp[j][k][1][1]);
			}
//			cout<<i<<" "<<L<<" "<<R<<endl;
			ans=add(ans,mul(L,quick_pow(K,j)));
			ans=add(ans,mul(R,quick_pow(K,i)));
			ans=sub(ans,mul(L,R));
		}
		printf("%d",ans);
	}
	else{
		f[0][0]=1;rep(i,K+1)sum[0][i][0]=1;
		REP(i,N)REP(j,K){
			f[i][j]=sub(sum[i-1][K][0],sum[i-1][j-1][0]);
			f[i][j]=add(f[i][j],mul(K-j+1,f[i-1][j-1]));
			g[i][j]=sub(sum[i-1][K][1],sum[i-1][j-1][1]);
			g[i][j]=add(g[i][j],mul(K-j+1,g[i-1][j-1]));
			if(j>=M)g[i][j]=add(g[i][j],f[i][j]);
			sum[i][j][0]=add(sum[i][j-1][0],f[i][j]);
			sum[i][j][1]=add(sum[i][j-1][1],g[i][j]);
//			cout<<i<<" "<<j<<" "<<f[i][j]<<" "<<g[i][j]<<endl;
		}
		int tmp=1;
		REP(i,M)tmp=mul(tmp,i);
		int ans=sum[N][K][1];
		memset(sum,0,sizeof(sum));
		memset(f,0,sizeof(f));
		memset(g,0,sizeof(g)); 
		f[0][0]=1;rep(i,K)sum[0][i][0]=1;
		REP(i,N)REP(j,K-1){
			f[i][j]=sub(sum[i-1][K-1][0],sum[i-1][j-1][0]);
			f[i][j]=add(f[i][j],mul(K-j+1,f[i-1][j-1]));
			g[i][j]=sub(sum[i-1][K-1][1],sum[i-1][j-1][1]);
			g[i][j]=add(g[i][j],mul(K-j+1,g[i-1][j-1]));
			if(j>=M)g[i][j]=add(g[i][j],f[i][j]);
			sum[i][j][0]=add(sum[i][j-1][0],f[i][j]);
			sum[i][j][1]=add(sum[i][j-1][1],g[i][j]);
//			cout<<i<<" "<<j<<" "<<f[i][j]<<" "<<g[i][j]<<endl;
		}
		ans=sub(ans,sum[N][K-1][1]);
		printf("%d",mul(ans,quick_pow(mul(C[K][M],tmp),mod-2)));
	}
	return 0;
}

/*
Input:
-----------------
Output:
*/

Measured memory_bytes: 240256