#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define rep2(i, s, n) for (ll i = (s); i < (ll)(n); i++)
#define all(v) v.begin(), v.end()
#define sz(v) v.size()
#define INF 10000000000000000 //10^16
template <typename T>
bool chmax(T &a, const T& b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
bool chmin(T &a, const T& b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

struct edge {
  ll to;
};
vector<vector<edge>> graph;

vector<ll> gold(200000, -1); // gold.at(i)は町iから到達可能なi以外の町で最も高い金の値段
vector<ll> A(200000);
vector<ll> gold2(200000, -1); // gold.at(i)は町iから到達可能な町で最も高い金の値段

ll bfs(ll x){
    if(gold2.at(x) != -1){
        return gold2.at(x);
    }
    ll M = A.at(x);
    ll L = -INF;
    bool upd = false;
    for(auto e : graph.at(x)){
        ll K = bfs(e.to);
        if(K >= M){
            upd = true;
            M = K;
        }
        chmax(L, K);
    }
    if(upd){
        gold.at(x) = M;
    }
    else{
        gold.at(x) = L;
    }
    gold2.at(x) = M;
    return M;
}

int main()
{
    ll N, M;
    cin >> N >> M;
    graph.resize(N);
    rep(i, N) cin >> A.at(i);
    vector<ll> X(M), Y(M);
    rep(i, M){
        cin >> X.at(i) >> Y.at(i);
        X.at(i)--;
        Y.at(i)--;
        graph.at(X.at(i)).push_back({Y.at(i)});
    }
    rep(i, N){
        if(gold.at(i) != -1){
            continue;
        }
        bfs(i);
    }
    ll ans = -INF;
    rep(i, N){
        chmax(ans, gold.at(i) - A.at(i));
    }
    cout << ans << endl;
}
#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0; i < (int)(n); i++)

using namespace std;
using LL = long long;
using P = pair<int,int>;
const long double INF = 2e12;
const long double eps = 1e-12;

int N, M, K;
vector<int> A;

long double solve(long double ans){
	vector<long double> dp(N + 1), sum(N + 1);
	rep(i,N){
		int n = N - 1 - i;
		if(A[n]) dp[n] = ans;
		else dp[n] = (sum[i] - sum[max(0, i - M)]) / M + 1;
		sum[i+1] = sum[i] + dp[n];
	}
	return dp[0];
}

long double binary_search(long double left, long double right){
	if(right - left < eps * left) return left;
	long double ans = sqrt(left * right);
	long double res = solve(ans);
	if(ans > res) right = ans;
	else left = ans;
	return binary_search(left, right);
}

int main(){
	cin >> N >> M >> K;
	A = vector<int>(N + 1);
	rep(i,K){
		int a;
		cin >> a;
		A[a] = 1;
	}
	int num = 0;
	rep(i,N+1){
		if(A[i]) num++;
		else num = 0;
		if(num >= M){
			cout << -1 << endl;
			return 0;
		}
	}
	cout << setprecision(20) << binary_search(1, INF) << endl;

	return 0;
}
