#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<set>
#include<queue>
#include<stack>
#include<math.h>
#include<time.h>
#include<deque>
#include<cstring>
#define ll long long
#define DB double
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define pb push_back
#define F first
#define S second
#define mp make_pair
#define pf push_front
#define MOD (ll)(998244353)
#define INF (ll)(1e9)
#define M 5000005
#define endl "\n"
#define AC ios::sync_with_stdio(0);cin.tie(0);
using namespace std;

template<class T> using PQ=priority_queue<T,vector<T>,greater<T> >;

int e[20],dp[(1<<19)];

signed main(){
    AC;
    int n,m;
    cin>>n>>m;
    FOR(i,0,m){
        int a,b;
        cin>>a>>b;
        a--; b--;
        e[a]|=(1<<b);
        e[b]|=(1<<a);
    }
    FOR(i,0,(1<<n)) dp[i]=INF;
    dp[0]=1;
    FOR(i,0,n)FOR(j,0,(1<<n)){
        if(dp[j]==1&&(e[i]&j)==j) dp[j|(1<<i)]=1;
    }
    FOR(i,1,(1<<n))for(int j=i-1;j&=i;j--){
        dp[i]=min(dp[i],dp[i^j]+dp[j]);
    }
    cout<<dp[(1<<n)-1]<<endl;
}

#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define ALL(v) begin(v),end(v)
template<typename A, typename B> inline bool chmax(A & a, const B & b) { if (a < b) { a = b; return true; } return false; }
template<typename A, typename B> inline bool chmin(A & a, const B & b) { if (a > b) { a = b; return true; } return false; }
using ll = long long;
using pii = pair<int, int>;
constexpr ll INF = 1ll<<30;
constexpr ll longINF = 1ll<<60;
constexpr ll MOD = 1000000007;
constexpr bool debug = false;
//---------------------------------//

int main() {
	int N, M, K;
	cin >> N >> M >> K;
	vector<int> A(K);
	REP(i, K) cin >> A[i];
	vector<bool> inA(N);
	for (int a : A) inA[a] = true;
	
	{
		int p = 0;
		while (p < N) {
			bool update = false;
			for (int i = M; i >= 1; --i) {
				if (p + i < N && inA[p + i]) continue;
				update = true;
				p += i;
				break;
			}
			if (!update) { puts("-1"); return 0; }
		}
	}
	
	vector<double> dp0(N + 1), dp(N + 1);
	double s0 = 0, s = 0;
	for (int i = N - 1; i >= 0; --i) {
		if (i + M + 1 <= N) { s0 -= dp0[i + M + 1] / M; s -= dp[i + M + 1] / M; }
		
		if (inA[i]) { dp0[i] = 1; dp[i] = 0; }
		else { dp0[i] = s0; dp[i] = s + 1; }
		
		s0 += dp0[i] / M;
		s += dp[i] / M;
	}
	
	double ans = dp[0] / (1 - dp0[0]);
	printf("%.16f\n", ans);
}