#include <bits/stdc++.h>
using namespace std;
int read() {
  char cc = getchar();
  int cn = 0, flus = 1;
  while (cc < '0' || cc > '9') {
    if (cc == '-') flus = -flus;
    cc = getchar();
  }
  while (cc >= '0' && cc <= '9') cn = cn * 10 + cc - '0', cc = getchar();
  return cn * flus;
}
const int N = 40000 + 5;
const int M = 1000 + 5;
const int K = 24;
const int inf = 99999999;
int dis[N][K], n, m, k, dp[(1 << K)];
int g1[N], g2[N], b[M], p[K], top, ans;
queue<int> q;
void input() {
  n = read(), k = read(), m = read();
  int a;
  for (int i = 1; i <= k; i++) a = read(), g1[a] ^= 1, g1[a + 1] ^= 1;
  for (int i = 1; i <= m; i++) b[i] = read();
  for (int i = 1; i <= n + 1; i++) {
    if ((g1[i]) == 1) p[++top] = i;
  }
  return;
}
void bfs(int x, int id) {
  dis[x][id] = 0;
  q.push(x);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = 1; i <= m; i++) {
      int to = x + b[i];
      if (to <= n + 1 && dis[to][id] > dis[x][id] + 1) {
        dis[to][id] = dis[x][id] + 1;
        q.push(to);
      }
      to = x - b[i];
      if (to > 0 && dis[to][id] > dis[x][id] + 1) {
        dis[to][id] = dis[x][id] + 1;
        q.push(to);
      }
    }
  }
}
void work() {
  int x = (1 << (top)) - 1;
  for (int i = 0; i <= x; i++) dp[i] = inf;
  dp[0] = 0;
  for (int i = 0; i <= x; i++) {
    if (dp[i] >= inf) continue;
    for (int j = 1; j <= top; j++) {
      if (i & (1 << (j - 1))) continue;
      for (int k = j + 1; k <= top; k++) {
        if (i & (1 << (k - 1))) continue;
        dp[i + (1 << (j - 1)) + (1 << (k - 1))] =
            min(dp[i + (1 << (j - 1)) + (1 << (k - 1))], dp[i] + dis[p[k]][j]);
      }
    }
  }
}
void solve() {
  sort(b + 1, b + m + 1);
  memset(dis, 63, sizeof(dis));
  for (int i = 1; i <= top; i++) {
    bfs(p[i], i);
  }
  work();
  if (dp[(1 << top) - 1] == inf)
    printf("%d\n", -1);
  else
    printf("%d\n", dp[(1 << top) - 1]);
}
signed main() {
  input();
  solve();
  return 0;
}
