#include <bits/stdc++.h>
using namespace std;
inline int in() {
  int32_t x;
  scanf("%d", &x);
  return x;
}
inline long long lin() {
  long long x;
  scanf("%lld", &x);
  return x;
}
inline string get() {
  char ch[2000010];
  scanf("%s", ch);
  return ch;
}
inline void read(int *a, int n) {
  for (int i = 0; i < n; i++) a[i] = in();
}
template <class blank>
inline void out(blank x) {
  cout << x << "\n";
  exit(0);
}
template <class blank>
inline void smin(blank &a, blank b) {
  a = min(a, b);
}
template <class blank>
inline void smax(blank &a, blank b) {
  a = max(a, b);
}
const int maxn = 1e5 + 10;
const int maxm = 1e6 + 10;
const int maxlg = 21;
const int base = 29;
const int mod = 1e9 + 7;
const int inf = 1e9 + 10;
const int SQ = 317;
bool has[maxn];
int a[maxn], di[maxn], h, t, q[maxn], cst[50][50], dp[maxn * 30];
vector<int> vc;
int32_t main() {
  int n = in(), k = in(), l = in();
  for (int i = 0; i < k; i++) has[in()] = true;
  for (int i = 1; i <= n + 1; i++)
    if (has[i] != has[i - 1]) vc.push_back(i);
  read(a, l);
  memset(cst, 63, sizeof cst);
  for (int _ = 0; _ < vc.size(); _++) {
    int v = vc[_];
    memset(di, 63, (n + 2) * sizeof di[0]);
    h = t = 0;
    di[v] = 0;
    q[t++] = v;
    while (h < t) {
      int v = q[h++];
      for (int i = 0; i < l; i++) {
        if (v + a[i] >= 1 && v + a[i] <= n + 1 && di[v + a[i]] > di[v] + 1)
          di[v + a[i]] = di[v] + 1, q[t++] = v + a[i];
        a[i] *= -1;
        if (v + a[i] >= 1 && v + a[i] <= n + 1 && di[v + a[i]] > di[v] + 1)
          di[v + a[i]] = di[v] + 1, q[t++] = v + a[i];
        a[i] *= -1;
      }
    }
    for (int i = 0; i < vc.size(); i++) cst[_][i] = di[vc[i]];
  }
  memset(dp, 63, sizeof dp);
  dp[0] = 0;
  int sz = (int)vc.size();
  for (int i = 1; i < (1 << sz); i++) {
    int f = __builtin_ctz(i & -i);
    for (int j = f + 1; j < vc.size(); j++)
      if (i & (1 << j))
        dp[i] = min(dp[i], dp[i ^ (1 << f) ^ (1 << j)] + cst[f][j]);
  }
  int mask = (1 << sz) - 1;
  if (dp[mask] >= inf)
    cout << -1;
  else
    cout << dp[mask] << "\n";
}
