#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10010;
const int MAXL = 110;
const int MAXK = 31;
const int MAXM = 1 << 21;
const int INF = 1000000000;
int pos[MAXK], xtot;
int ai[MAXL];
int n, k, L;
int g[MAXK][MAXK];
int f[MAXM];
queue<int> que;
int dist[MAXN];
bool vis[MAXN];
void init() {
  scanf("%d%d%d", &n, &k, &L);
  xtot = 0;
  int tmp[MAXK];
  for (int i = 0; i < k; ++i) scanf("%d", &tmp[i]);
  for (int i = 0; i < k; ++i) {
    if (i == 0 || tmp[i - 1] + 1 != tmp[i]) pos[xtot++] = tmp[i] - 1;
    if (i == k - 1 || tmp[i + 1] - 1 != tmp[i]) pos[xtot++] = tmp[i];
  }
  for (int i = 0; i < L; ++i) scanf("%d", &ai[i]);
}
void updata(int x, int y) {
  if (dist[x] + 1 < dist[y]) {
    dist[y] = dist[x] + 1;
    if (!vis[y]) que.push(y);
    vis[y] = 1;
  }
}
void g_cal(int st) {
  que.push(pos[st]);
  for (int i = 0; i <= n; ++i) dist[i] = INF;
  dist[pos[st]] = 0;
  for (int i = 0; i <= n; ++i) vis[i] = 0;
  vis[pos[st]] = 1;
  for (int x; !que.empty();) {
    x = que.front();
    que.pop();
    for (int i = 0; i < L; ++i) {
      if (x + ai[i] <= n) updata(x, x + ai[i]);
      if (0 <= x - ai[i]) updata(x, x - ai[i]);
    }
    vis[x] = 0;
  }
  for (int i = 0; i < xtot; ++i) g[st][i] = dist[pos[i]];
}
void solve() {
  for (int i = 0; i < xtot; ++i) g_cal(i);
  f[0] = 0;
  int limit = 1 << xtot;
  for (int i, j, sta = 1; sta < limit; ++sta) {
    f[sta] = INF;
    for (i = 0; (sta & (1 << i)) == 0; ++i)
      ;
    for (j = i + 1; j < xtot; ++j)
      if (sta & (1 << j))
        f[sta] = min(f[sta], f[sta ^ (1 << i) ^ (1 << j)] + g[i][j]);
  }
  if (f[limit - 1] < INF)
    printf("%d\n", f[limit - 1]);
  else
    puts("-1");
}
int main() {
  init();
  solve();
  return 0;
}
