#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <utility>
#include <algorithm>
#include <cmath>
#include <climits>
#include <iomanip>
#include <queue>
#include <stack>
#include <ctype.h>

using namespace std;

typedef long long ll;

const int INF = (1<<30)-1;
const ll LINF = 1e18;

#define rep(i, n) for (int i = 0; i < n; i++)

template<class T> 
bool chmax(T &a, T b) {if (a < b) {a = b;return true;}else return false;}

template<class T> 
bool chmin(T &a, T b) {if (a > b) {a = b;return true;}else return false;}

int main() {
    int n, m, k;    cin >> n >> m >> k;
    vector<int> a(n+1, 0);
    rep(i, k) {
        int x;  cin >> x;
        a[x] = 1;
    }
    for (int i = 0; i < n+1; i++) {
        int j = i;
        while (j < n+1 && a[j] == 1)
            j++;
        if (j - i >= m) {
            cout << -1 << endl;
            return 0;
        }
        i = j;
    }
    vector<double> b(n+m+10), c(n+m+10), sb(n+m+10, 0), sc(n+m+10, 0);
    for (int i = n-1; i >= 0; i--) {
        if (a[i]) {
            b[i] = 1;
            c[i] = 0;
        }
        else {
            b[i] = (sb[i+1] - sb[i+m+1]) / m;
            c[i] = (sc[i+1] - sc[i+m+1]) / m + 1;
        }
        sb[i] = b[i] + sb[i+1];
        sc[i] = c[i] + sc[i+1];
    }
    cout << fixed << std::setprecision(15) << c[0] / (1 - b[0]) << endl;
    return 0;
}

//小数点精度
//cout << fixed << std::setprecision(15) << y << endl;
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i = 0; i < (int)n; i++)
using ll = long long;
const double eps = 1e-10;
const double INF = 1e9;

class Union_Find{
  vector<int> par; vector<int> rank; vector<int> num;
public:
  Union_Find(int n) {
    par = vector<int>(n); rank = vector<int>(n,0); num = vector<int>(n,1);
    rep(i,n) par[i] = i;
  }
  int find(int x) {
    if(par[x] == x) return x;
    else  return par[x] = find(par[x]);
  }
  int number(int x) {
    return num[find(x)];
  }
  void unite(int x, int y) {
    x = find(x); y = find(y);
    if (x == y) return;
    if (rank[x] < rank[y]) swap(x, y);
    if (rank[x] == rank[y]) rank[x]++;
    par[y] = x;
    num[x] += num[y];
  } 
  bool same(int x, int y) {
    return find(x) == find(y);
  }
};

int main(){
  int n;
  cin >> n;
  double x[n], y[n];
  rep(i,n) cin >> x[i] >> y[i];
  double l = 0, r = 100.0;
  while(r - l > eps) {
    double m = (l + r) / 2;
    Union_Find uf(n+2);
    rep(i,n) {
      if(y[i]+m > -m+100.0) uf.unite(n,i);
      if(y[i]-m < m-100.0) uf.unite(n+1,i);
    }
    rep(i,n) rep(j,n) if((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]) < 4.0*m*m) uf.unite(i,j);
    if(uf.find(n) == uf.find(n+1)) r = m;
    else l = m;
  }
  printf("%.12lf\n",l);
  return 0;
}
