#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f, mod = 1000000007;
int dp[1 << 20], num[1 << 20], low[1 << 20], f[10005], dis[10005], mn[22][22],
    len[105], cnt[22];
int n, k, l, tot = 0;
queue<int> q;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  for (; ch < '0' || ch > '9'; ch = getchar())
    if (ch == '-') f = -1;
  for (; ch >= '0' && ch <= '9'; ch = getchar())
    x = (x << 1) + (x << 3) + ch - '0';
  return x * f;
}
void Get_Shortest_Path(int rt) {
  memset(dis, 0x3f, sizeof(dis));
  dis[cnt[rt]] = 0;
  q.push(cnt[rt]);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = 1; i <= l; i++) {
      if (u + len[i] <= n + 1 && dis[u + len[i]] > dis[u] + 1) {
        dis[u + len[i]] = dis[u] + 1;
        q.push(u + len[i]);
      }
      if (u - len[i] > 0 && dis[u - len[i]] > dis[u] + 1) {
        dis[u - len[i]] = dis[u] + 1;
        q.push(u - len[i]);
      }
    }
  }
  for (int i = 1; i <= tot; i++) mn[rt][i] = dis[cnt[i]];
}
int main() {
  n = read();
  k = read();
  l = read();
  for (int i = 1; i <= k; i++) {
    int x = read();
    f[x] = 1;
  }
  for (int i = 1; i <= n + 1; i++)
    if (f[i] ^ f[i - 1]) cnt[++tot] = i;
  for (int i = 1; i <= l; i++) len[i] = read();
  for (int i = 1; i <= tot; i++) Get_Shortest_Path(i);
  low[1] = 0;
  for (int i = 2; i < (1 << tot); i++) low[i] = low[i >> 1] + 1;
  for (int i = 1; i < (1 << tot); i++) num[i] = num[i - (i & -i)] + 1;
  memset(dp, 0x3f, sizeof(dp));
  dp[0] = 0;
  for (int i = 0; i < (1 << tot); i++) {
    if (num[i] & 1) continue;
    int j = ((1 << tot) - 1) ^ i;
    j = low[j & -j] + 1;
    for (int k = j + 1; k <= tot; k++)
      dp[i | (1 << (j - 1)) | (1 << (k - 1))] =
          min(dp[i | (1 << (j - 1)) | (1 << (k - 1))], dp[i] + mn[j][k]);
  }
  printf("%d\n", dp[(1 << tot) - 1] == inf ? -1 : dp[(1 << tot) - 1]);
  return 0;
}
