#include <bits/stdc++.h>
using namespace std;
int n;
pair<int, int> a[1010];
inline double F(int x) { return x * x; }
inline double D(const pair<int, int> &u, const pair<int, int> &v) {
  return sqrt(F(u.first - v.first) + F(u.second - v.second));
}
struct Edge {
  int to, next, w;
  double fi;
} e[1000000];
int c1, head[1010];
inline void add_edge(int u, int v, int w, double fi) {
  e[c1].to = v;
  e[c1].w = w;
  e[c1].fi = fi;
  e[c1].next = head[u];
  head[u] = c1++;
}
inline void Add_edge(int u, int v, int w, double fi) {
  add_edge(u, v, w, fi);
  add_edge(v, u, 0, -fi);
}
int la[1010], pre[1010], fl[1010], s, t;
double dis[1010];
bool vis[1010];
bool spfa() {
  fill(dis, dis + 1010, 1000000000);
  dis[s] = 0;
  queue<int> Q;
  Q.push(s);
  pre[t] = -1;
  fl[s] = 1000000000;
  vis[s] = 1;
  while (!Q.empty()) {
    int u = Q.front();
    Q.pop();
    vis[u] = 0;
    for (int i = head[u]; ~i; i = e[i].next) {
      int v = e[i].to, w = e[i].w;
      double fi = e[i].fi;
      if (w > 0 && dis[v] > dis[u] + fi) {
        dis[v] = dis[u] + fi;
        la[v] = i;
        fl[v] = min(fl[u], w);
        pre[v] = u;
        if (vis[v]) continue;
        vis[v] = 1;
        Q.push(v);
      }
    }
  }
  return ~pre[t];
}
int mf;
double mc;
void mcmf() {
  while (spfa()) {
    int now = t;
    mf += fl[t];
    mc += fl[t] * dis[t];
    while (now != s) {
      e[la[now]].w -= fl[t];
      e[la[now] ^ 1].w += fl[t];
      now = pre[now];
    }
  }
}
int main() {
  fill(head, head + 1010, -1);
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cin >> n;
  for (int i = 1; i <= n; ++i) cin >> a[i].first >> a[i].second;
  s = 0;
  t = 2 * n + 1;
  for (int i = 1; i <= n; ++i) {
    Add_edge(s, i, 2, 0);
    Add_edge(i + n, t, 1, 0);
    for (int j = 1; j <= n; ++j)
      if (a[i].second > a[j].second) Add_edge(i, j + n, 1, D(a[i], a[j]));
  }
  mcmf();
  if (mf != n - 1)
    cout << "-1";
  else
    cout << fixed << setprecision(7) << mc << "\n";
  return 0;
}
