#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define N 3100
int root[N],len[N],head[N],v[N*2],next[N*2],num=0,du[N],n,q[N];
double ans=0;
bool vis[N];
void add(int x,int y){
     v[++num]=y;next[num]=head[x];head[x]=num;
     }
void dfs(int u,int L){
     if(vis[u])return;
     vis[u]=1;
     ans+=1.0/L;
     for(int i=head[u];i;i=next[i])
       dfs(v[i],L+1);
     vis[u]=0;
}
void Dfs(int u,int L,int st){
     len[u]=L;root[u]=st;vis[u]=1;
     for(int i=head[u];i;i=next[i])
       if(!vis[v[i]] && du[v[i]]<2)Dfs(v[i],L+1,st);
}
int main(){
    scanf("%d",&n);
    memset(head,0,sizeof head);num=0;
    for(int i=1;i<=n;i++){
      int X,Y;
      scanf("%d%d",&X,&Y);
      ++X;++Y;
      add(X,Y);add(Y,X);
      du[X]++;du[Y]++;
    }
    int t=0,w=0,sum=0;
    for(int i=1;i<=n;i++)
      if(du[i]==1)q[++w]=i;
    while(t<w){
      int u=q[++t];
      for(int i=head[u];i;i=next[i]){
        --du[v[i]];
        if(du[v[i]]==1)q[++w]=v[i];
      }
    }
    sum=n-w;
    memset(vis,0,sizeof vis);
    for(int i=1;i<=n;i++)
      if(du[i]==2)Dfs(i,0,i); 
    for(int i=1;i<=n;i++)printf("%d ",len[i]);printf("\n");
    memset(vis,0,sizeof vis);
    for(int i=1;i<=n;i++)dfs(i,1);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
       if(root[i]!=root[j])ans-=1.0/(len[i]+len[j]+sum);
    printf("%.8lf\n",ans);
    return 0;
}
