#include <bits/stdc++.h>
using namespace std;

const int Maxn = 25005, p = 1e9 + 7;
int n, k, m, pos, a[Maxn], cnt[405], ct, maxi;
long long f1[Maxn][405], f2[Maxn][405], F1[Maxn], F2[Maxn], sum[Maxn][405], sum2[Maxn][405], tot, ans;
bool vis[405];
long long fast_pow(long long x, long long y)
{
	long long ans = 1, now = x;
	while (y)
	{
		if (y & 1) ans = ans * now % p;
		now = now * now % p;
		y >>= 1;
	}
	return ans;
}
long long fac(int x)
{
	if (x == 1) return 1;
	else return x * fac(x - 1) % p;
}
int main()
{
	scanf("%d%d%d", &n, &k, &m);
	tot = fast_pow(k, n - m);
	(tot *= (n - m + 1)) %= p;
	for (int i = 1; i <= m; i++)
		scanf("%d", &a[i]);
	if (m >= k)
	{
		for (int i = 1; i <= k; i++)
		{
			cnt[a[i]]++;
			if (cnt[a[i]] == 1) ct++;
		}
		maxi = ct;
		for (int i = k + 1; i <= m; i++)
		{
			cnt[a[i]]++;
			if (cnt[a[i]] == 1) ct++;
			cnt[a[i - k]]--;
			if (!cnt[a[i - k]]) ct--;
			maxi = max(maxi, ct);
		}
		if (maxi != k) goto A;
		printf("%lld", tot);
		return 0;
	}
	A:memset(vis, 0, sizeof(vis));
	bool tag = true;
	for (int i = 1; i <= m; i++)
	{
		if (!vis[a[i]]) vis[a[i]] = true;
		else tag = false;
	}
	if (!tag)
	{
		memset(vis, 0, sizeof(vis));
		for (int i = 1; i <= m; i++)
		{
			if (!vis[a[i]]) vis[a[i]] = true;
			else
			{
				pos = i - 1;
				break;
			}
		}
		f1[0][pos] = 1;
		for (int i = k - 1; i >= 1; i--)
			sum[0][i] = (sum[0][i + 1] + f1[0][i]) % p;
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j < k; j++)
			{
				(f1[i][j] += f1[i - 1][j - 1] * (k - j + 1) % p) %= p;
				(f1[i][j] += sum[i - 1][j]) %= p;
			}
			for (int j = k - 1; j >= 1; j--)
				sum[i][j] = (sum[i][j + 1] + f1[i][j]) % p;
		}
		memset(vis, 0, sizeof(vis));
		memset(sum, 0, sizeof(sum));
		for (int i = m; i >= 1; i--)
		{
			if (!vis[a[i]]) vis[a[i]] = true;
			else
			{
				pos = m - i;
				break;
			}
		}
		f2[0][pos] = 1;
		for (int i = k - 1; i >= 1; i--)
			sum[0][i] = (sum[0][i + 1] + f2[0][i]) % p;
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j < k; j++)
			{
				(f2[i][j] += f2[i - 1][j - 1] * (k - j + 1) % p) %= p;
				(f2[i][j] += sum[i - 1][j]) %= p;
			}
			for (int j = k - 1; j >= 1; j--)
				sum[i][j] = (sum[i][j + 1] + f2[i][j]) % p;
		}
		for (int i = 0; i <= n; i++)
			for (int j = 1; j < k; j++)
				(F1[i] += f1[i][j]) %= p, (F2[i] += f2[i][j]) %= p;
		for (int i = 0; i <= n - m; i++)
			(ans += F1[i] * F2[n - m - i] % p) %= p;
		printf("%lld", (tot - ans + p) % p);
	}
	else
	{
		f1[0][0] = 1;
		for (int i = k - 1; i >= 1; i--)
			sum[0][i] = (sum[0][i + 1] + f1[0][i]) % p;
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j < k; j++)
			{
				(f1[i][j] += f1[i - 1][j - 1] * (k - j + 1) % p) %= p;
				(f1[i][j] += sum[i - 1][j]) %= p;
				(f2[i][j] += f2[i - 1][j - 1] * (k - j + 1) % p) %= p;
				(f2[i][j] += sum2[i - 1][j]) %= p;
			}
			for (int j = m; j < k; j++)
				(f2[i][j] += f1[i][j]) %= p;
			for (int j = k - 1; j >= 0; j--)
			{
				sum[i][j] = (sum[i][j + 1] + f1[i][j]) % p;
				sum2[i][j] = (sum2[i][j + 1] + f2[i][j]) % p;
			}
		}
		for (int j = 1; j < k; j++)
			(ans += f2[n][j]) %= p;
		printf("%lld", (tot - ans * fast_pow(fac(k), p - 2) % p * fac(k - m) % p + p) % p);
	}
	return 0;
}

Measured memory_bytes: 317056