#include <bits/stdc++.h>
using namespace std;
bool fl[11000], stream[11000];
int n, k, l, tmp, a[11000], dis[22][11000], pos[22];
vector<int> nodes;
void BFS(int s, int cord) {
  dis[s][cord] = 0;
  queue<int> q;
  q.push(cord);
  while (!q.empty()) {
    int cur = q.front();
    q.pop();
    for (int i = 1; i <= l; i++) {
      int nc1 = cur - a[i];
      int nc2 = cur + a[i];
      if (nc1 >= 0 && nc1 <= n) {
        if (dis[s][nc1] > dis[s][cur] + 1) {
          dis[s][nc1] = dis[s][cur] + 1;
          if (!stream[nc1]) q.push(nc1);
        }
      }
      if (nc2 >= 0 && nc2 <= n) {
        if (dis[s][nc2] > dis[s][cur] + 1) {
          dis[s][nc2] = dis[s][cur] + 1;
          if (!stream[nc2]) q.push(nc2);
        }
      }
    }
  }
}
int dp[(1 << 20) + 10];
int main() {
  scanf("%d %d %d", &n, &k, &l);
  for (int i = 1; i <= k; i++) scanf("%d", &tmp), fl[tmp] = 1;
  for (int i = 1; i <= l; i++) scanf("%d", &a[i]);
  for (int i = 0; i <= n; i++) {
    stream[i] = (fl[i] != fl[i + 1]);
    if (stream[i]) pos[i] = nodes.size(), nodes.push_back(i);
  }
  memset(dis, 0x3f, sizeof dis);
  for (int i = 0; i < nodes.size(); i++) BFS(i, nodes[i]);
  int tot = nodes.size();
  memset(dp, 0x3f, sizeof dp);
  dp[0] = 0;
  for (int mask = 1; mask < (1 << tot); mask++) {
    int low = -1;
    for (int i = 0; i < tot && (low == -1); i++)
      if (mask & (1 << i)) low = i;
    for (int j = 0; j < tot; j++)
      if ((mask & (1 << j)) && j != low)
        dp[mask] = min(dp[mask],
                       dis[low][nodes[j]] + dp[mask ^ (1 << low) ^ (1 << j)]);
  }
  cout << ((dp[(1 << tot) - 1] == dp[1]) ? -1 : dp[(1 << tot) - 1]) << endl;
}
