#include <bits/stdc++.h>
using namespace std;
long long num;
vector<long long> len;
vector<long long> vec;
long long dis[21][21];
long long dp[1 << 21];
long long dfs[10005];
bool delim[10005];
long long n, k, l;
int recur(long long mask) {
  long long &res = dp[mask];
  if (res != -1) return res;
  vector<int> bits;
  for (long long i = 0; i < ((long long)((long long)vec.size())); i++)
    if (mask & (1 << i)) bits.push_back(i);
  for (long long i = 0; i < ((long long)((long long)bits.size())); i++)
    if (i > 0) {
      long long tmp = recur(mask ^ (1 << bits[0]) ^ (1 << bits[i]));
      long long t = dis[bits[0]][bits[i]];
      if (tmp != -2 && t != -1)
        res = (res == -1) ? (tmp + t) : min(res, tmp + t);
    }
  if (res == -1) res = -2;
  return res;
}
int main() {
  for (long long i = 0; i < ((long long)10005); i++) delim[i] = false;
  cin >> n >> k >> l;
  for (long long i = 0; i < ((long long)k); i++) {
    long long tmp;
    cin >> tmp;
    delim[tmp] = !delim[tmp];
    delim[tmp - 1] = !delim[tmp - 1];
  }
  for (long long i = 0; i < ((long long)l); i++) {
    long long tmp;
    cin >> tmp;
    len.push_back(tmp);
  }
  for (long long i = 0; i < ((long long)10005); i++)
    if (delim[i]) vec.push_back(i);
  for (long long i = 0; i < ((long long)((long long)vec.size())); i++) {
    for (long long j = 0; j < ((long long)10005); j++) dfs[j] = -1;
    dfs[vec[i]] = 0;
    queue<int> q;
    q.push(vec[i]);
    while (((long long)q.size())) {
      long long tmp = q.front();
      q.pop();
      for (long long j = 0; j < ((long long)((long long)len.size())); j++) {
        if (len[j] + tmp <= n && dfs[len[j] + tmp] == -1) {
          dfs[len[j] + tmp] = dfs[tmp] + 1;
          q.push(len[j] + tmp);
        }
        if (tmp - len[j] >= 0 && dfs[tmp - len[j]] == -1) {
          dfs[tmp - len[j]] = dfs[tmp] + 1;
          q.push(tmp - len[j]);
        }
      }
    }
    for (long long j = 0; j < ((long long)((long long)vec.size())); j++)
      dis[i][j] = dfs[vec[j]];
  }
  for (long long i = 0; i < ((long long)1 << 21); i++) dp[i] = -1;
  dp[0] = 0;
  long long tmp = recur((1 << ((long long)vec.size())) - 1);
  cout << ((tmp == -2) ? -1 : tmp) << endl;
}
