#include <bits/stdc++.h>
using namespace std;
template <class T>
bool ckmax(T& x, T y) {
  return x < y ? x = y, 1 : 0;
}
template <class T>
bool ckmin(T& x, T y) {
  return x > y ? x = y, 1 : 0;
}
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = 0;
    ch = getchar();
  }
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return f ? x : -x;
}
const int N = 40005;
const int M = 105;
const int K = 20;
int n, k, m, a[K], b[M], dif[N], c[K], tot, dis[K][N], cnt[1 << K], dp[1 << K];
bool vis[N];
void bfs(int* dis, int st) {
  static int q[N], ql, qr;
  q[ql = qr = 1] = st;
  for (int i = 1, iend = n + 1; i <= iend; ++i) dis[i] = 0x3f3f3f3f, vis[i] = 0;
  dis[st] = 0, vis[st] = 1;
  while (ql <= qr) {
    int u = q[ql++];
    for (int i = 1, iend = m; i <= iend; ++i) {
      if (u - b[i] >= 1 && !vis[u - b[i]])
        dis[u - b[i]] = dis[u] + 1, vis[u - b[i]] = 1, q[++qr] = u - b[i];
      if (u + b[i] <= n + 1 && !vis[u + b[i]])
        dis[u + b[i]] = dis[u] + 1, vis[u + b[i]] = 1, q[++qr] = u + b[i];
    }
  }
}
signed main() {
  n = read(), k = read(), m = read();
  for (int i = 1, iend = k; i <= iend; ++i) {
    a[i] = read();
    dif[a[i]] ^= 1, dif[a[i] + 1] ^= 1;
  }
  for (int i = 1, iend = m; i <= iend; ++i) b[i] = read();
  for (int i = 1, iend = n + 1; i <= iend; ++i)
    if (dif[i] == 1) c[tot++] = i;
  for (int i = 0; i < tot; ++i) bfs(dis[i], c[i]);
  memset(dp, 0x3f, sizeof(dp)), dp[0] = 0;
  for (int msk = 0; msk < 1 << tot; ++msk) {
    cnt[msk] = cnt[msk >> 1] + (msk & 1);
    if (cnt[msk] & 1) continue;
    int st = -1;
    for (int i = 0; i < tot; ++i) {
      if (msk >> i & 1) {
        if (!~st)
          st = i;
        else
          ckmin(dp[msk], dp[msk ^ (1 << st) ^ (1 << i)] + dis[st][c[i]]);
      }
    }
  }
  int ans = dp[(1 << tot) - 1];
  printf("%d\n", ans == 0x3f3f3f3f ? -1 : ans);
}
