#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
using namespace std;
const int Maxn=3005;
int n;
int fst[Maxn],next[Maxn*2],to[Maxn*2],En=0;
int ind[Maxn],Q[Maxn],tot=0;
double ans=0;

inline int get() {
	char ch;
	while (!isdigit(ch=getchar()));
	int v=ch-48;
	while (isdigit(ch=getchar())) v=v*10+ch-48;
	return v;
}

void add(int x,int y) {
	++ind[x]; ++ind[y];
	next[++En]=fst[x]; fst[x]=En; to[En]=y;
	next[++En]=fst[y]; fst[y]=En; to[En]=x;
}

void bfs(int s) {
	static int d1[Maxn],d2[Maxn];
	static bool flag[Maxn];
	memset(flag,0,n);
	int l=1,r=2;
	flag[Q[1]=s]=1;
	d1[s]=ind[s]; d2[s]=1;
	while (l<r) {
		int x=Q[l++];
		if (d1[x]<=1) ans+=1.0/d2[x];
		else ans+=1.0/d2[x]+1.0/(d2[x]-d1[x]*2+tot+2)-1.0/(d2[x]-d1[x]+tot);
		for (int k=fst[x];k;k=next[k])
			if (!flag[to[k]]) {
				flag[Q[r++]=to[k]]=1;
				d1[to[k]]=d1[x]+ind[to[k]];
				d2[to[k]]=d2[x]+1;
			}
	}
}

int main() {
	n=get();
	for (int i=0;i<n;i++) add(get(),get());
	int l=1,r=1;
	for (int i=0;i<n;i++)
		if (ind[i]==1) Q[r++]=i;
	while (l<r) {
		int x=Q[l++];
		for (int k=fst[x];k;k=next[k])
			if ((--ind[to[k]])==1) Q[r++]=to[k];
	}
	for (int i=0;i<n;i++) tot+=(ind[i]=ind[i]==1?0:1);
	for (int i=0;i<n;i++) bfs(i);
	printf("%.10lf\n",ans);
	return 0;
}