#include <bits/stdc++.h>
using namespace std;
const int INF = 2000000000;
int n, k, l;
int m[10010], a[110];
int v[10010], b[10010];
vector<int> p;
int dist[10100];
int d[25][25];
int mem[3000000];
inline int abs(int x) { return max(x, -x); }
void bfs(int x) {
  memset(dist, -1, sizeof dist);
  queue<int> Q;
  Q.push(p[x]);
  dist[p[x]] = 0;
  int node;
  while (!Q.empty()) {
    node = Q.front();
    Q.pop();
    for (int i = 0; i < l; ++i) {
      if (node - a[i] >= 0 && dist[node - a[i]] == -1) {
        dist[node - a[i]] = dist[node] + 1;
        Q.push(node - a[i]);
      }
      if (node + a[i] <= n && dist[node + a[i]] == -1) {
        dist[node + a[i]] = dist[node] + 1;
        Q.push(node + a[i]);
      }
    }
  }
  for (int i = 0; i < p.size(); ++i) d[x][i] = dist[p[i]];
}
int solve(int mask) {
  if (mem[mask] != -1) return mem[mask];
  if (mask == (1 << p.size()) - 1) return 0;
  int x = -1;
  for (int i = 0; i < p.size(); ++i)
    if (~mask >> i & 1) {
      x = i;
      break;
    }
  int _mask = mask | 1 << x;
  int ret = INF;
  for (int i = 0; i < p.size(); ++i) {
    if ((~_mask >> i & 1) && (i != x)) {
      int tmp = solve(_mask | 1 << i);
      if (tmp != INF && d[x][i] != -1) ret = min(ret, tmp + d[x][i]);
    }
  }
  return mem[mask] = ret;
}
int main(void) {
  scanf("%d%d%d", &n, &k, &l);
  for (int i = 0; i < k; ++i) {
    int x;
    scanf("%d", &x);
    v[x] = 1;
  }
  for (int i = 0; i < l; ++i) scanf("%d", &a[i]);
  for (int i = 0; i <= n; ++i)
    if (v[i] != v[i + 1]) b[i] = 1;
  for (int i = 0; i <= n; ++i)
    if (b[i] == 1) p.push_back(i);
  for (int i = 0; i < p.size(); ++i) bfs(i);
  memset(mem, -1, sizeof mem);
  int sol = solve(0);
  printf("%d\n", sol == INF ? -1 : sol);
  return 0;
}
