#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<algorithm>
#define fs(i,x,y) for(int i=(x),_=(y);i<=_;++i)
#define fn(i,x,y) for(int i=(x),_=(y);i>=_;--i)
#define tor(i,v,x) for(int i=head[x],v=to[i];i;i=nxt[i],v=to[i])
#define Li inline
#define R register int
#define ls(x) ch[x][0]
#define rs(x) ch[x][1]
#define mpi(x,y) make_pair(x,y)
#define pi pair<int,int>
#define int ll
using namespace std;
typedef long long ll;
template<typename T>
void read(T &x){
	x=0;char ch=getchar();bool f=0;
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
	x=f?-x:x;
}

const int N=2e5+7;
const double eps=1e-8;
int n,m,k;
int a[N];
double dp1[N],dp2[N];
double suf1[N],suf2[N];
bool vis[N];

signed main(){
	read(n);read(m);read(k);
	fs(i,1,k)read(a[i]),vis[a[i]]=true;
	fn(i,n-1,0){
		dp1[i]=(suf1[i+1]-suf1[i+m+1])/m+1.0;
		dp2[i]=(suf2[i+1]-suf2[i+m+1])/m;
		fs(j,1,k){
			if(i+1<=a[j]&&a[j]<=i+m)dp2[i]+=1.0/m;
		}
		if(vis[i])dp1[i]=dp2[i]=0;
		suf1[i]=suf1[i+1]+dp1[i];
		suf2[i]=suf2[i+1]+dp2[i];
	}
	if(fabs(1.0-dp2[0])<eps)printf("-1");
	else printf("%lf",dp1[0]/(1-dp2[0]));
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;++i)
#define mp make_pair
#define pb push_back
#define size sze
#define inf 998244353
int n,k;
vector<int> g[210000];
int v[210000],dep[210000];
int q[210000];
int f[210000][20],size[210000],son[210000],minp[210000];
int father[210000],root;
struct node
{
    int adj,valid,next;
}edge[2*210000];
int gh[210000],top;
void addedge(int x, int y) {
	edge[++top].adj = y;
	edge[top].valid = 1;
	edge[top].next = gh[x];
	gh[x] = top;
}
void get_size(int x, int root=0) {
	size[x] = 1; son[x] = 0;
	int dd = 0;
	for (int p=gh[x]; p; p=edge[p].next)
		if (edge[p].adj != root && edge[p].valid) {
			get_size(edge[p].adj, x);
			size[x] += size[edge[p].adj];
			if (size[edge[p].adj] > dd) {
				dd = size[edge[p].adj];
				son[x] = edge[p].adj;
			}
		}
}
int getroot(int x) {
	get_size(x);
	int sz = size[x];
	while (size[son[x]] > sz/2)
		x = son[x];
	return x;
}
int dc(int x,int fa) {
	x = getroot(x);
    father[x]=fa;
	for (int p=gh[x]; p; p=edge[p].next)
		if (edge[p].valid) {
			edge[p].valid = 0;
			edge[p^1].valid = 0;
			dc(edge[p].adj,x);
		}
    return x;
}
bool cmp(int x,int y)
{
    return dep[x]>dep[y];
}
void dfs(int x,int pre,int depp)
{
    f[x][0]=pre;
    for(int i=1;i<=17;i++)f[x][i]=f[f[x][i-1]][i-1];
    dep[x]=depp;
    for(int p=gh[x];p;p=edge[p].next)
        if (edge[p].adj!=pre)dfs(edge[p].adj,x,depp+1);
}
int jump(int x,int d)
{
    int delta=dep[x]-d;
    for(int i=17;i>=0;i--)
        if (delta & (1<<i))x=f[x][i];
    return x;
}
int lca(int x,int y)
{
    if (dep[x]<dep[y])swap(x,y);
    x=jump(x,dep[y]);
   // cout<<x<<" "<<y<<endl;
    if (x==y)return x;
    for(int i=17;i>=0;i--)
        if (f[x][i]!=f[y][i])
        {
            x=f[x][i];
            y=f[y][i];
        }
    return f[x][0];
}
int dis(int x,int y)
{
    return dep[x]+dep[y]-2*dep[lca(x,y)];
}
void insert(int x)
{
    int now=x;
    while (now!=0)
    {
        if (minp[now]==n+1 || dis(now,x)<dis(now,minp[now]))minp[now]=x;
        now=father[now];
    }
}
int get(int x)
{
    int ret=2147483647;
    int now=x;
    while (now!=0)
    {
        if (minp[now]!=n+1)ret=min(ret,dis(x,minp[now]));
        now=father[now];
    }
    return ret;
}
bool check(int lim)
{   
    for(int i=1;i<=n;i++)minp[i]=n+1;
    int tot=0;
    for(int i=1;i<=n;i++)
    {
        //cout<<q[i]<<endl;
        if (get(q[i])>lim)
        {
            int fa=jump(q[i],max(dep[q[i]]-lim,0));
            insert(fa);
            tot++;
        }
        if (tot>k)return 0;
    }
    return 1;
}

int main()
{
    cin>>n>>k; top=1;
    for(int i=1;i<n;i++)
    {
        int x,y; 
        scanf("%d%d",&x,&y);
        addedge(x,y);
        addedge(y,x);
    }

    dfs(1,0,0);

    root=dc(1,0);
    //cout<<lca(3,2)<<" "<<lca(3,5)<<" "<<lca(4,5)<<endl;
    for(int i=1;i<=n;i++)q[i]=i;
    sort(q+1,q+n+1,cmp);
    long long l=1; long long r=n;

    
    //for(int i=1;i<=n;i++)cout<<father[i]<<" "; puts("");
    while (l<r)
    {
        int mid=(l+r)/2;
       // cout<<mid<<endl;
        if (check(mid))r=mid;
        else l=mid+1;
    }
    cout<<l<<endl;
    return 0;
}