#include <bits/stdc++.h>
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
#define FORD(i,r,l) for(int i=(r);i>=(l);i--)
#define rep(i,n) for(int i=0;i<(n);i++)
using namespace std;
typedef long long LL;
const int maxn=80002,maxm=160002;

int pos,ta[maxn],lin[maxm],sd[maxm];
void biu(int s,int t)
{
    ++pos;
    lin[pos]=ta[s];
    ta[s]=pos;
    sd[pos]=t;
    ++pos;
    lin[pos]=ta[t];
    ta[t]=pos;
    sd[pos]=s;
}

int n,q;
int fa[maxn];
int f[maxn],ff[maxn],fi[maxn],se[maxn];
int dl[maxn]; bool vis[maxn];
void bfs(int bt)
{
    int l=0,r=0;
    dl[++r]=bt; vis[bt]=1;
    int v;
    while (l<r)
    {
        v=dl[++l];
        for (int i=ta[v];i;i=lin[i])
            if (!vis[sd[i]])
            {
                vis[sd[i]]=1;
                fa[sd[i]]=v;
                dl[++r]=sd[i];
            }
    }
    for (int z=r;z>=1;z--)
    {
        v=dl[z];
        fi[v]=0; se[v]=0;
        for (int i=ta[v];i;i=lin[i])
            if (fa[sd[i]]==v)
            {
                if (se[v]<fi[sd[i]]+1) se[v]=fi[sd[i]]+1;//--
                if (fi[v]<se[v]) swap(fi[v],se[v]);
            }
    }
}
void dfs(int v,int bt)
{
    f[v]=fi[v],ff[v]=0;
    if (v!=bt)//??
    {
        if (fi[fa[v]]!=fi[v]+1) ff[v]=fi[fa[v]]+1;
        else ff[v]=se[fa[v]]+1;
        ff[v]=max(ff[v],ff[fa[v]]+1);
        f[v]=max(f[v],ff[v]);
    }
    for (int i=ta[v];i;i=lin[i])
        if (fa[sd[i]]==v)
            dfs(sd[i],bt);
}
int so[maxn];
LL hzh[maxn];
void init()
{
    pos=0;
    for (int i=1;i<=n+q;i++) ta[i]=0,vis[i]=0,fa[i]=0;
}
int ef(int d)
{
    int l=1,r=q,mid;
    while (l<=r)
    {
        mid=l+r>>1;
        if (d<=so[mid]) r=mid-1;
        else l=mid+1;
    }
    return l;
}
int main(){
    for (int a,b;scanf("%d%d",&n,&q)!=EOF;)
    {
        init();
        for (int i=1;i<n;i++) scanf("%d%d",&a,&b),biu(a,b);
        for (int i=1;i<q;i++) scanf("%d%d",&a,&b),biu(a+n,b+n);
        bfs(1); bfs(n+1);
        dfs(1,1); dfs(n+1,n+1);
        int maxs=0;
        for (int i=1;i<=n;i++) maxs=max(maxs,f[i]);
        for (int i=1;i<=q;i++) maxs=max(maxs,f[i+n]),so[i]=f[i+n];
        sort(so+1,so+1+q);
        hzh[q+1]=0;
        for (int i=q;i>=1;i--) hzh[i]=hzh[i+1]+so[i];
        LL ans=0;
        for (int i=1;i<=n;i++)
        {
            int *it=lower_bound(so+1,so+1+q,maxs-f[i]-1),bj=it-so;
            //int bj=ef(maxs-f[i]-1);
            ans+=(LL)(bj-1)*maxs+(LL)(f[i]+1)*(q-bj+1)+hzh[bj];
        }
        printf("%.3f\n",double(ans)/n/q);
    }
    return 0;
}