#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int md=1e9+7;
int n,k,m;
int ans;
int dp[25010][410];
int ndp[25010][410];
int a[25010];
int cnt;
int s[25010];
bool f;
void add(int &x,int y)
{
	x+=y;
	if(x>=md)x-=md;
}
int qmul(int x,int p)
{
	int res=1;
	for(;p;x=1LL*x*x%md,p>>=1)if(p&1)res=1LL*res*x%md;
	return res;
}
int solve2()
{
	ndp[0][0]=1;
	for(int i=1;i<=n;i++)
	{
		int nsum,sum;
		nsum=sum=0;
		for(int j=k-1;j>=1;j--)
		{
			add(nsum,ndp[i-1][j]);
			add(ndp[i][j],1LL*(k-j+1)*ndp[i-1][j-1]%md);
			add(ndp[i][j],nsum);
			add(sum,dp[i-1][j]);
			add(dp[i][j],1LL*(k-j+1)*dp[i-1][j-1]%md);
			add(dp[i][j],sum);
			if(j>=m)add(dp[i][j],ndp[i][j]);
		}
	}
	int res=0;
	for(int i=1;i<=k;i++)add(res,dp[n][i]);
	int tmp=1;
	for(int i=k;i>=k-m+1;i--)tmp=1LL*tmp*i%md;
	res=1LL*res*qmul(tmp,md-2)%md;
	return res;
}
int solve3()
{
	memset(s,0,sizeof(s));
	int h=0;
	while(h+1<=m && !s[a[h+1]])s[a[h+1]]++,h++;
	memset(s,0,sizeof(s));
	int t=m+1;
	while(t-1>=1 && !s[a[t-1]])s[a[t-1]]++,t--;
	dp[0][h]=ndp[0][m+1-t]=1;
	for(int i=1;i<=n-m;i++)
	{
		int sum,nsum;
		sum=nsum=0;
		for(int j=k-1;j>=1;j--)
		{
			add(nsum,ndp[i-1][j]);
			add(ndp[i][j],1LL*(k-j+1)*ndp[i-1][j-1]%md);
			add(ndp[i][j],nsum);
			add(sum,dp[i-1][j]);
			add(dp[i][j],1LL*(k-j+1)*dp[i-1][j-1]%md);
			add(dp[i][j],sum);
		}
	}
	int res=0;
	for(int i=0;i<=n-m;i++)
	{
		int s1=0,s2=0;
		for(int j=1;j<k;j++)add(s1,dp[i][j]),add(s2,ndp[n-m-i][j]);
		add(res,1LL*s1*s2%md);
	}
	return res;
}
int main()
{
	scanf("%d%d%d",&n,&k,&m);
	for(int i=1;i<=m;i++)scanf("%d",a+i);
	ans=n+1-m;
	for(int i=1;i<=n-m;i++)ans=1LL*ans*k%md;
	for(int i=1;i<=m;i++)
	{
		s[a[i]]++;
		if(s[a[i]]==1)cnt++;else if(s[a[i]]==2)cnt--;
		if(i>k)
		{
			s[a[i-k]]--;
			if(s[a[i-k]]==1)cnt++;else if(s[a[i-k]]==0)cnt--;
		}
		if(cnt==k)
		{
			f=true;
			break;
		}
	}
	if(!f)
	{
		if(cnt==m)add(ans,md-solve2());
		else add(ans,md-solve3());
	}
	printf("%d",ans);
	return 0;
}