#include <bits/stdc++.h>
using namespace std;
inline long long min(long long x, long long y) { return x < y ? x : y; }
inline long long max(long long x, long long y) { return x > y ? x : y; }
const int Maxn = 1e4 + 5;
int n, k, m, ans = -1;
int a[Maxn], b[105], c[30], dis[30][Maxn], f[2000005], pw[30];
bool inq[Maxn];
void SPFA(register int x, register int p) {
  dis[p][x] = 0;
  queue<int> q;
  q.push(x);
  while (!q.empty()) {
    x = q.front();
    q.pop();
    inq[x] = false;
    for (register int i = 1, nx; i <= m; i++) {
      nx = x + b[i];
      if (nx <= n + 1)
        if (dis[p][x] + 1 < dis[p][nx]) {
          dis[p][nx] = dis[p][x] + 1;
          if (!inq[nx]) {
            q.push(nx);
            inq[nx] = true;
          }
        }
      nx = x - b[i];
      if (nx > 0)
        if (dis[p][x] + 1 < dis[p][nx]) {
          dis[p][nx] = dis[p][x] + 1;
          if (!inq[nx]) {
            q.push(nx);
            inq[nx] = true;
          }
        }
    }
  }
}
int main() {
  pw[0] = 1;
  for (int i = 1; i <= 25; i++) pw[i] = pw[i - 1] << 1;
  memset(dis, 0x3f, sizeof(dis));
  int pos, siz = 0;
  cin >> n >> k >> m;
  for (int i = 1; i <= k; i++) {
    scanf("%d", &pos);
    a[pos] = 1;
  }
  for (int i = 1; i <= m; i++) scanf("%d", &b[i]);
  for (int i = 0; i <= n; i++)
    if (a[i + 1] != a[i]) {
      c[++siz] = i + 1;
      SPFA(i + 1, siz);
    }
  n = siz;
  memset(f, 0x3f, sizeof(f));
  f[0] = 0;
  int nx;
  for (int i = 0; i < pw[n] - 3; i++)
    for (int j = 1; j < n; j++)
      for (int k = j + 1; k <= n; k++) {
        if ((i & pw[j - 1]) || (i & pw[k - 1])) continue;
        nx = i | pw[j - 1] | pw[k - 1];
        f[nx] = min(f[nx], f[i] + dis[j][c[k]]);
      }
  if (f[pw[n] - 1] == 0x3f3f3f3f) f[pw[n] - 1] = -1;
  cout << f[pw[n] - 1] << endl;
  return 0;
}
