#include <bits/stdc++.h>
using namespace std;
int n, k, l;
int num = 1;
int a[10010], x[25];
struct node {
  int to;
  int next;
} road[3000000];
int head[10010];
int d[10010], q[10010], L = 1, R = 0;
int cost[25][25];
int f[(1 << 20) + 5];
void build(int from, int to) {
  road[++num].next = head[from];
  road[num].to = to;
  head[from] = num;
}
void bfs(int num) {
  int s = x[num];
  memset(d, 0x3f, sizeof(d));
  L = 1, R = 0;
  d[s] = 0;
  q[++R] = s;
  while (L <= R) {
    int x = q[L];
    L++;
    for (int i = head[x]; i; i = road[i].next) {
      int y = road[i].to;
      if (d[y] > 1e9) {
        d[y] = d[x] + 1;
        q[++R] = y;
      }
    }
  }
  for (int i = 1; i <= k; i++) {
    cost[num][i] = d[x[i]];
  }
}
int main() {
  scanf("%d%d%d", &n, &k, &l);
  for (int i = 1; i <= k; i++) {
    int X;
    scanf("%d", &X);
    a[X] = 1;
  }
  n++;
  k = 0;
  for (int i = 1; i <= n; i++) {
    if (a[i] ^ a[i - 1]) x[++k] = i;
  }
  if (k & 1) {
    printf("-1\n");
    return 0;
  }
  memset(a, 0, sizeof(a));
  for (int i = 1; i <= l; i++) {
    scanf("%d", &a[i]);
    for (int j = 1; j <= n; j++) {
      if (j + a[i] <= n) build(j, j + a[i]);
      if (j - a[i] >= 1) build(j, j - a[i]);
    }
  }
  for (int i = 1; i <= k; i++) {
    bfs(i);
  }
  memset(f, 0x3f, sizeof(f));
  f[0] = 0;
  int tot = (1 << k) - 1;
  for (int i = 1; i <= tot; i++) {
    int cnt = 0;
    for (int j = 1; j <= k; j++) {
      if ((i >> (j - 1)) & 1) cnt++;
    }
    if (cnt & 1) continue;
    for (int j = 1; j <= k; j++) {
      if (((i >> (j - 1)) & 1) == 0) continue;
      for (int t = 1; t < j; t++) {
        if (((i >> (t - 1)) & 1) == 0) continue;
        if (j == t) continue;
        f[i] = min(f[i], f[i ^ (1 << (j - 1)) ^ (1 << (t - 1))] + cost[j][t]);
      }
    }
  }
  printf("%d\n", f[tot] > 1e9 ? -1 : f[tot]);
  return 0;
}
