#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod=1000000007;
inline void add(int &x,int y){(x+=y)>=mod?x-=mod:0;}
inline int kpow(int a,int b)
{
	int s=1;
	for(;b;b>>=1,a=1ll*a*a%mod)
		if(b&1)s=1ll*s*a%mod;
	return s;
}
int jc(int x)
{
	int s=1;
	for(int i=2;i<=x;++i)s=1ll*s*i%mod;
	return s;
}
int n,k,m,cnt,ans,f[25050][410],g[25050][410],a[25050],last[410];
bool vis[410];
int main()
{
	scanf("%d %d %d",&n,&k,&m);
	ans=1ll*(n-m+1)*kpow(k,n-m)%mod;
	int r=0;
	bool ok=0;
	for(int i=1;i<=m;++i)
	{
		scanf("%d",&a[i]);
		r=max(r,last[a[i]]+k);
		last[a[i]]=i;
		if(r==i)ok=1;
		if(!vis[a[i]])vis[a[i]]=1,++cnt;
	}
	if(ok);
	else if(cnt==m)
	{
		f[0][0]=1;
		for(int i=1;i<=n;++i)
		{
			int sf=0,sg=0;
			for(int j=k-1;j;--j)
			{
				add(sf,f[i-1][j]);
				add(sg,g[i-1][j]);
				add(f[i][j],sf);
				add(g[i][j],sg);
				if(j)f[i][j]=(f[i][j]+1ll*f[i-1][j-1]*(k-j+1))%mod,g[i][j]=(g[i][j]+1ll*g[i-1][j-1]*(k-j+1))%mod;
				if(j>=m)add(g[i][j],f[i][j]);
			}
		}
		int res=0;
		for(int i=1;i<k;++i)add(res,g[n][i]);
		ans=(ans+1ll*(mod-res)*jc(k-m)%mod*kpow(jc(k),mod-2))%mod;
	}
	else
	{
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=m;++i)
			if(vis[a[i]]){f[0][i-1]=1;break;}
			else vis[a[i]]=1;
		memset(vis,0,sizeof(vis));
		for(int i=m;i;--i)
			if(vis[a[i]]){g[0][m-i]=1;break;}
			else vis[a[i]]=1;
		for(int i=1;i<=n;++i)
		{
			int sf=0,sg=0;
			for(int j=k-1;j;--j)
			{
				add(sf,f[i-1][j]);
				add(sg,g[i-1][j]);
				add(f[i][j],sf);
				add(g[i][j],sg);
				if(j)f[i][j]=(f[i][j]+1ll*f[i-1][j-1]*(k-j+1))%mod,g[i][j]=(g[i][j]+1ll*g[i-1][j-1]*(k-j+1))%mod;
			}
		}
		int res=0;
		for(int i=1;i<=n-m+1;++i)
		{
			int sf=0,sg=0;
			for(int j=1;j<k;++j)add(sf,f[i-1][j]),add(sg,g[n-m+1-i][j]);
			res=(res+1ll*sf*sg)%mod;
		}
		add(ans,mod-res);
	}
	printf("%d",ans);
	return 0;
}
