#include<bits/stdc++.h>

using namespace std;

#define rep(i,m,n) for(int (i)=(int)(m);(i)<(int)(n);(i)++)
#define rep2(i,m,n) for(int (i)=(int)(n)-1;(i)>=(int)(m);(i)--)
#define REP(i,n) rep(i,0,n)
#define REP2(i,n) rep2(i,0,n)
#define FOR(i,c) for(decltype((c).begin())i=(c).begin();i!=(c).end();++i)
#define ll long long
#define ull unsigned long long
#define all(hoge) (hoge).begin(),(hoge).end()
#define en '\n'
typedef pair<ll, ll> P;
constexpr long long INF = 1LL << 60;
constexpr int INF_INT = 1 << 25;

typedef vector<ll> Array;
typedef vector<Array> Matrix;
template <class T> using vec = vector<T>;
template <class T> using vvec = vector<vec<T>>;

//constexpr long long MOD = (ll) 1e9+7;
constexpr long long MOD = 998244353;

template<class T> inline bool chmin(T& a, T b) {
	if (a > b) {
		a = b;
		return true;
	}
	return false;
}
template<class T> inline bool chmax(T& a, T b) {
	if (a < b) {
		a = b;
		return true;
	}
	return false;
}

struct Edge {
	int to, cap, rev;
	Edge(int _to, int _cap, int _rev) {
		to = _to; cap = _cap; rev = _rev;
	}
};
typedef vector<Edge> Edges;
typedef vector<Edges> Graph;

void add_edge(Graph& G, int from, int to, int cap, bool revFlag, int revCap) {
	G[from].push_back(Edge(to, cap, G[to].size()));
	if (revFlag)G[to].push_back(Edge(from, revCap, G[from].size() - 1));
}

//素因数分解
void factoring(ll n, vector<P>& vec) {
 	for (ll i = 2; i * i <= n; i++) {
        ll con=0;
  		while (n % i == 0) {
   			con++;
   			n /= i;
  		}
        if(con>0) vec.push_back({i,con});
 	}
 	if (n != 1) vec.push_back({n,1});
}


//最大公約数
ll gcd(ll m, ll n) {
 if (n == 0)return m;
 return gcd(n, m % n);
}//gcd

//最小公倍数
ll lcm(ll m, ll n) {
 return m / gcd(m, n) * n;
}

class Combination {
public:
 Array fact;//n！
 Array inv;//n!の逆元
 ll mod;
 Combination(ll n, ll _mod) {
  mod = _mod;
  fact.resize(n + 1);
  fact[0] = 1;
  REP(i, n) {
   fact[i + 1] = (fact[i] * (i + 1LL)) % mod;
  }
  inv.resize(n + 1);
  inv[n] = mod_inv(fact[n]);
  for(int i=n;i>0;i--) {
   inv[i - 1] = inv[i] * i % mod;
  }
 }
 //modの逆元
 ll mod_inv(ll x) {
  ll n = mod - 2;
  ll res = 1LL;
  while (n > 0) {
   if (n & 1) res = res * x % mod;
   x = x * x % mod;
   n >>= 1;
  }
  return res;
 }
 ll nCr(ll n, ll r) {
  return ((fact[n] * inv[r] % mod) * inv[n - r]) % mod;
 }
 ll nPr(ll n, ll r) {
  return (fact[n] * inv[n - r]) % mod;
 }
 ll nHr(ll n, ll r) {
  //重複組み合わせ：n種類のものからr種類選ぶ
  return nCr(r + n - 1, r);
 }
};

Combination comb(101010,MOD);


ll check(vec<P> x) {
    ll sum=0;
    ll mul=1;
    for(auto i:x){
        (sum+=i.second)%=MOD;
        (mul*=comb.fact[i.second])%=MOD;
    }
    return comb.fact[sum]*comb.mod_inv(mul)%MOD;
}

void solve() {
    ll n;
    cin>>n;
    vec<long double> x(n),y(n);
    REP(i,n) cin>>x[i]>>y[i];
    Array order(n);
    REP(i,n) order[i]=i;
    long double ans=0.0;
    long double con=0.0;
    do{
        REP(i,n-1){
            ans+=sqrt((x[order[i]]-x[order[i+1]])*(x[order[i]]-x[order[i+1]])+(y[order[i]]-y[order[i+1]])*(y[order[i]]-y[order[i+1]]));
        }
        con+=1.0;
    }while(next_permutation(all(order)));
    cout<<fixed<<setprecision(10)<<ans/con<<en;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	solve();
	//int t; cin >> t; REP(i, t) solve();

	return 0;
}


Measured memory_bytes: 1792