#include <bits/stdc++.h>
using namespace std;
int N, K, L;
int x[30], a[110];
int dist[10010];
int graph[30][30];
int dp[(1 << 20)];
queue<int> q;
void add(int pos, int d) {
  if (d < dist[pos]) {
    dist[pos] = d;
    q.push(pos);
  }
}
void bfs(int start) {
  int i;
  for ((i) = 0; (i) < (int)(N + 1); (i)++) dist[i] = (1 << 29);
  add(start, 0);
  while (!q.empty()) {
    int pos = q.front();
    q.pop();
    for ((i) = 0; (i) < (int)(L); (i)++) {
      if (pos - a[i] >= 0) add(pos - a[i], dist[pos] + 1);
      if (pos + a[i] <= N) add(pos + a[i], dist[pos] + 1);
    }
  }
}
int main(void) {
  int mask, i, j;
  cin >> N >> K >> L;
  for ((i) = 0; (i) < (int)(K); (i)++) {
    cin >> x[i];
    x[i]--;
  }
  for ((i) = 0; (i) < (int)(L); (i)++) cin >> a[i];
  for ((i) = 0; (i) < (int)(K); (i)++) x[K + i] = x[i] + 1;
  K *= 2;
  for ((i) = 0; (i) < (int)(K); (i)++) {
    bfs(x[i]);
    for ((j) = 0; (j) < (int)(K); (j)++) graph[i][j] = dist[x[j]];
  }
  for ((i) = 0; (i) < (int)((1 << K)); (i)++) dp[i] = (1 << 29);
  dp[0] = 0;
  for ((mask) = 0; (mask) < (int)((1 << K)); (mask)++)
    if (mask != 0) {
      for ((i) = 0; (i) < (int)(K); (i)++)
        if (mask & (1 << i)) break;
      for ((j) = 0; (j) < (int)(K); (j)++)
        if (mask & (1 << j))
          if (i != j)
            dp[mask] =
                min(dp[mask], dp[mask ^ (1 << i) ^ (1 << j)] + graph[i][j]);
    }
  int ans = dp[(1 << K) - 1];
  if (ans == (1 << 29))
    cout << -1 << endl;
  else
    cout << ans << endl;
  return 0;
}
