#include <bits/stdc++.h>
using namespace std;
const int iinf = 1e9 + 7;
const long long linf = 1ll << 60;
const double dinf = 1e10;
template <typename T>
inline void scf(T &x) {
  bool f = 0;
  x = 0;
  char c = getchar();
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') {
    f = 1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  if (f) x = -x;
  return;
}
template <typename T1, typename T2>
void scf(T1 &x, T2 &y) {
  scf(x);
  return scf(y);
}
template <typename T1, typename T2, typename T3>
void scf(T1 &x, T2 &y, T3 &z) {
  scf(x);
  scf(y);
  return scf(z);
}
const int N = 1e4 + 100;
const int M = (1 << 20) + 100;
int n, m, k;
int dst[N];
int dp[M];
int opr[110];
bool a[N];
vector<int> pos;
int q[N];
int d[30][30];
int msk[30];
void BFS(int S) {
  int fnt, rar;
  fnt = rar = 0;
  q[rar++] = S;
  memset(dst, -1, sizeof(dst));
  dst[S] = 0;
  while (fnt != rar) {
    int u = q[fnt++];
    for (int i = 0; i < (k); i++) {
      int v = u + opr[i];
      if (v >= 1 && v <= n && dst[v] < 0) dst[v] = dst[u] + 1, q[rar++] = v;
      v = u - opr[i];
      if (v >= 1 && v <= n && dst[v] < 0) dst[v] = dst[u] + 1, q[rar++] = v;
    }
  }
  return;
}
inline void update(int &x, const int &y) {
  if (x == -1 || y < x) x = y;
  return;
}
int main() {
  scf(n, m, k);
  n++;
  for (int i = (1); i <= (m); i++) {
    int x;
    scf(x);
    a[x] = 1;
  }
  for (int i = 0; i < (k); i++) scf(opr[i]);
  for (int i = (1); i <= (n); i++)
    if (a[i] != a[i - 1]) pos.push_back(i);
  m = (int)pos.size();
  for (int i = 0; i < (m); i++) msk[i] = 1 << i;
  for (int i = 0; i < (m); i++) {
    BFS(pos[i]);
    for (int j = 0; j < (m); j++) d[i][j] = dst[pos[j]];
  }
  int MASK = 1 << m;
  memset(dp, -1, sizeof(dp));
  dp[0] = 0;
  for (int i = 0; i < (MASK); i++)
    if (dp[i] >= 0) {
      for (int u = 0; u < (m); u++)
        if (!(msk[u] & i))
          for (int v = (u + 1); v <= (m - 1); v++)
            if (!(msk[v] & i) && d[u][v] != -1) {
              int mask = i | msk[u] | msk[v];
              update(dp[mask], dp[i] + d[u][v]);
            }
    }
  printf("%d\n", dp[MASK - 1]);
  return 0;
}
