#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
using namespace std;
const int N = 10000 + 10;
const int MOD = 1000000007;
const int LOG = 20;
const int INF = 1000000010;
const int delta = 11353;
int n, k, l, a[N], b[N], X[N], dis[22][N], inv[N], cnt, dp[(1 << 20) + 10];
vector<int> G[N];
inline void BFS(int x) {
  for (int i = 0; i < N; i++) dis[x][i] = INF;
  dis[x][inv[x]] = 0;
  queue<int> q;
  q.push(inv[x]);
  while (q.size()) {
    int fr = q.front();
    q.pop();
    for (auto u : G[fr]) {
      if (dis[x][u] > dis[x][fr] + 1) {
        dis[x][u] = dis[x][fr] + 1;
        q.push(u);
      }
    }
  }
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> k >> l;
  for (int i = 1; i <= k; i++) {
    int x;
    cin >> x;
    X[x] = 1;
  }
  for (int i = 1; i <= l; i++) cin >> a[i];
  for (int i = 0; i <= n; i++) {
    b[i] = (X[i] != X[i + 1]);
  }
  for (int i = 0; i <= n; i++) {
    for (int j = 1; j <= l; j++) {
      if (i - a[j] >= 0) G[i].push_back(i - a[j]), G[i - a[j]].push_back(i);
    }
  }
  for (int i = 0; i <= n; i++) {
    if (b[i]) inv[cnt] = i, BFS(cnt), cnt++;
  }
  fill(dp, (dp + (1 << 20) + 10), INF);
  dp[0] = 0;
  for (int mask = 1; mask < (1 << cnt); mask++) {
    int Fi = -1;
    for (int i = 0; i < cnt; i++) {
      if (mask & (1 << i)) {
        if (Fi == -1)
          Fi = i;
        else {
          dp[mask] =
              min(dp[mask], dp[mask ^ (1 << Fi) ^ (1 << i)] + dis[Fi][inv[i]]);
        }
      }
    }
  }
  cout << (dp[(1 << cnt) - 1] == INF ? -1 : dp[(1 << cnt) - 1]);
  return 0;
}
