#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10000;
const long long INFFLUJO = 1e14;
const double INFCOSTO = 1e14;
struct edge {
  int u, v;
  long long cap, flow;
  double cost;
  long long rem() { return cap - flow; }
};
int nodes;
vector<int> G[MAXN];
vector<edge> e;
void addEdge(int u, int v, long long cap, double cost) {
  G[u].push_back(((int)e.size()));
  e.push_back((edge){u, v, cap, 0, cost});
  G[v].push_back(((int)e.size()));
  e.push_back((edge){v, u, 0, 0, -cost});
}
double dist[MAXN], mnCost;
int pre[MAXN];
long long cap[MAXN], mxFlow;
bool in_queue[MAXN];
void flow(int s, int t) {
  memset(in_queue, 0, sizeof(in_queue));
  mxFlow = mnCost = 0;
  while (1) {
    fill(dist, dist + nodes, INFCOSTO);
    dist[s] = 0;
    memset(pre, -1, sizeof(pre));
    pre[s] = 0;
    memset(cap, 0, sizeof(cap));
    cap[s] = INFFLUJO;
    queue<int> q;
    q.push(s);
    in_queue[s] = 1;
    while (((int)q.size())) {
      int u = q.front();
      q.pop();
      in_queue[u] = 0;
      for (auto it : G[u]) {
        edge &E = e[it];
        if (E.rem() && dist[E.v] > dist[u] + E.cost + 1e-9) {
          dist[E.v] = dist[u] + E.cost;
          pre[E.v] = it;
          cap[E.v] = min(cap[u], E.rem());
          if (!in_queue[E.v]) q.push(E.v), in_queue[E.v] = 1;
        }
      }
    }
    if (pre[t] == -1) break;
    mxFlow += cap[t];
    mnCost += cap[t] * dist[t];
    for (int v = t; v != s; v = e[pre[v]].u) {
      e[pre[v]].flow += cap[t];
      e[pre[v] ^ 1].flow -= cap[t];
    }
  }
}
int x[500], y[500];
int main() {
  int n;
  scanf("%d", &n);
  int mx = -1100000;
  for (int i = 0; i < int(n); i++) {
    scanf("%d %d", x + i, y + i);
    mx = max(mx, y[i]);
  }
  int cnt = 0;
  for (int i = 0; i < int(n); i++)
    if (y[i] == mx) cnt++;
  if (cnt > 1)
    printf("-1\n");
  else {
    nodes = 2 * n + 2;
    for (int i = 0; i < int(n); i++)
      for (int j = 0; j < int(n); j++)
        if (y[i] > y[j]) {
          addEdge(i, n + j, 1,
                  sqrt(1ll * (x[i] - x[j]) * (x[i] - x[j]) +
                       1ll * (y[i] - y[j]) * (y[i] - y[j])));
        }
    for (int i = 0; i < int(n); i++) addEdge(2 * n, i, 2, 0);
    for (int i = 0; i < int(n); i++)
      if (y[i] != mx) addEdge(n + i, 2 * n + 1, 1, 0);
    flow(2 * n, 2 * n + 1);
    if (mxFlow != n - 1)
      printf("-1\n");
    else
      printf("%.10lf\n", mnCost);
  }
}
