#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<math.h>
struct Point {
  double x;
  double y;
};
struct Point *p;
double **dist;
double btsp(int size);
int main(void)
{
  int i, n;
  scanf("%d", &n);
  p = (struct Point*)malloc(sizeof(struct Point) * n);
  dist = (double**)malloc(sizeof(double*) * n);
  for (i = 0; i < n; i++) {
    dist[i] = (double*)malloc(sizeof(double) * n);
    scanf("%lf%lf", &p[i].x, &p[i].y);
  }
  printf("%f\n", btsp(n));
  for (i = 0; i < n; i++) free(dist[i]);
  free(dist);
  free(p);
}
double btsp(int size)
{
  int i, j, k;
  double t, ans;
  for (j = 0; j < size; j++) {
    for (i = 0; i < j; i++) {
      if (i == 0 && j == 1) dist[i][j] = hypot(p[i].x - p[j].x, p[i].y - p[j].y);
      else if (i < j - 1) dist[i][j] = dist[i][j-1] +  hypot(p[j-1].x - p[j].x, p[j-1].y - p[j].y);
      else {
        dist[i][j] = INT_MAX;
        for (k = 0; k < i; k++){
          t = dist[k][i] +  hypot(p[k].x - p[j].x, p[k].y - p[j].y);
          if (t < dist[i][j]) dist[i][j] = t;
        }
      }
    }
  }
  ans = INT_MAX;
  for (i = 0; i < size - 1; i++) {
    t = dist[i][size-1] +  hypot(p[i].x - p[size-1].x, p[i].y - p[size-1].y);
    if (t < ans) ans = t;
  }
  return ans;
}
