#include <bits/stdc++.h>
using namespace std;
int m, k, l, n;
int x[22], a[110];
int f[(1 << 20)];
int que[10010], dis[10010], g[22][22];
int pos[22];
bool inq[10010];
int head, tail;
bool tag[10010];
void input() {
  memset(tag, 0, sizeof(tag));
  for (int i = 1; i <= k; i++) {
    scanf("%d", x + i);
    tag[x[i]] = true;
  }
  for (int i = 1; i <= l; i++) scanf("%d", a + i);
  n = 0;
  for (int i = 0; i <= m; i++)
    if (tag[i] != tag[i + 1]) pos[n++] = i;
}
void update(int curx, int nextx) {
  if (dis[curx] + 1 < dis[nextx] || dis[nextx] == -1) {
    dis[nextx] = dis[curx] + 1;
    if (!inq[nextx])
      que[tail] = nextx, inq[nextx] = true, tail = (tail + 1) % 10010;
  }
}
void cal_path() {
  for (int i = 0; i < n; i++) {
    memset(dis, -1, sizeof(dis));
    memset(inq, 0, sizeof(inq));
    que[0] = pos[i];
    dis[pos[i]] = 0;
    for (head = 0, tail = 1; head != tail; head = (head + 1) % 10010) {
      int curx = que[head];
      for (int j = 1; j <= l; j++) {
        if (curx - a[j] >= 0) update(curx, curx - a[j]);
        if (curx + a[j] <= m) update(curx, curx + a[j]);
      }
      inq[curx] = false;
    }
    for (int j = 0; j < n; j++) g[i][j] = dis[pos[j]];
  }
}
void dp() {
  memset(f, 255, sizeof(f));
  f[0] = 0;
  for (int i = 0; i < 1 << n; i++)
    if (f[i] != -1) {
      int j;
      for (j = 0; j < n && (i & (1 << j)); j++)
        ;
      for (int k = j + 1; k < n; k++)
        if ((i & (1 << k)) == 0 && g[j][k] != -1) {
          int v = i | (1 << j) | (1 << k);
          if (f[i] + g[j][k] < f[v] || f[v] == -1) f[v] = f[i] + g[j][k];
        }
    }
  printf("%d\n", f[(1 << n) - 1]);
}
int main() {
  while (scanf("%d%d%d", &m, &k, &l) != EOF) {
    input();
    cal_path();
    dp();
  }
  return 0;
}
