#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const int SIZE = 10010;
int N, K, L;
bool on[SIZE];
vector<int> steps;
vector<int> v;
int dist[22][SIZE];
void bfs(int idx) {
  queue<int> q;
  q.push(v[idx]);
  dist[idx][v[idx]] = 0;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = 0; i < (int)steps.size(); i++) {
      for (int d = -1; d <= 1; d += 2) {
        if (x + d * steps[i] <= N && x + d * steps[i] >= 0 &&
            dist[idx][x + d * steps[i]] == -1) {
          dist[idx][x + d * steps[i]] = 1 + dist[idx][x];
          q.push(x + d * steps[i]);
        }
      }
    }
  }
}
int table[1 << 20];
int get(int mask) {
  if (!mask) return 0;
  if (table[mask] != -1) return table[mask];
  int i = log2(mask & -mask);
  int mm = mask & (~(1 << i));
  int r = INF;
  for (int j = i + 1; j < (int)v.size(); j++) {
    if ((mask >> j) & 1) {
      int current = dist[i][v[j]];
      if (current == -1) continue;
      current += get(mm & (~(1 << j)));
      r = min(r, current);
    }
  }
  return table[mask] = r;
}
int main() {
  cin >> N >> K >> L;
  for (int i = 0; i < K; i++) {
    int x;
    cin >> x;
    on[x] = true;
  }
  for (int i = 0; i <= N; i++)
    if (on[i] != on[i + 1]) v.push_back(i);
  for (int i = 0; i < L; i++) {
    int x;
    cin >> x;
    steps.push_back(x);
  }
  memset(dist, -1, sizeof dist);
  for (int i = 0; i < (int)v.size(); i++) bfs(i);
  memset(table, -1, sizeof table);
  int r = get((1 << v.size()) - 1);
  if (r < INF) assert(v.size() % 2 == 0);
  cout << (r >= INF ? -1 : r) << endl;
  return 0;
}
