#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
const int INF = 0x3f3f3f3f;
int n, k, l, dist[22][maxn], p[30], f[1 << 22], z[maxn], y[maxn], s[110];
queue<int> que;
int dfs(int s, int cnt) {
  if (s == 0) return 0;
  if (f[s]) return f[s];
  f[s] = INF;
  for (int a = 1; a <= cnt; a++)
    if (s & (1 << (a - 1)))
      for (int b = a + 1; b <= cnt; b++)
        if (s & (1 << (b - 1)))
          f[s] = min(f[s], dist[a][p[b]] +
                               dfs(s ^ (1 << (a - 1)) ^ (1 << (b - 1)), cnt));
  return f[s];
}
int main() {
  scanf("%d%d%d", &n, &k, &l);
  for (int a = 1; a <= k; a++) {
    int p;
    scanf("%d", &p);
    z[p] = 1;
  }
  for (int a = 1; a <= n + 1; a++) y[a] = z[a - 1] ^ z[a];
  for (int a = 1; a <= l; a++) scanf("%d", &s[a]);
  int cnt = 0;
  for (int a = 1; a <= n + 1; a++)
    if (y[a] == 1) {
      cnt++;
      p[cnt] = a;
      memset(dist[cnt], 0x3f, sizeof(dist[cnt]));
      dist[cnt][a] = 0;
      que.push(a);
      while (que.size()) {
        int now = que.front();
        que.pop();
        for (int b = 1; b <= l; b++) {
          if (now + s[b] <= n + 1 && dist[cnt][now + s[b]] == INF) {
            dist[cnt][now + s[b]] = dist[cnt][now] + 1;
            que.push(now + s[b]);
          }
          if (now - s[b] > 0 && dist[cnt][now - s[b]] == INF) {
            dist[cnt][now - s[b]] = dist[cnt][now] + 1;
            que.push(now - s[b]);
          }
        }
      }
    }
  if (dfs((1 << cnt) - 1, cnt) == INF)
    printf("-1\n");
  else
    printf("%d\n", dfs((1 << cnt) - 1, cnt));
  return 0;
}
