#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <utility>
#include <set>
using namespace std;
typedef pair< pair<int, int>, int > piii;
double ta = 0.0, tb = 0.0;

bool comp(const piii &a, const piii &b) {
  double tmpa = (a.first.first - ta) * (b.first.second - tb);
  double tmpb = (a.first.second - tb) * (b.first.first - ta);
  return tmpa < tmpb;
}

bool comp2(const piii &a, const piii &b) {
  double tmpa = atan2(a.first.second - tb, a.first.first - ta);
  double tmpb = atan2(b.first.second - tb, b.first.first - ta);
  return tmpa > tmpb;
}

int main(void) {
  int i, j, k, v, r, s, t, max = -10000, maxn;
  double ans = 0.0;
  scanf("%d%d", &v, &r);
  double dis[v][v];
  piii p[v];
  bool flg[v];
  for(i = 0; i < v; ++i) flg[i] = true;
  vector<int> vec[v];
  for(i = 0; i < v; ++i) {
    scanf("%d%d", &p[i].first.first, &p[i].first.second);
    p[i].second = i;
    if(i < 3) ta += p[i].first.first, tb += p[i].first.second;
  }
  for(i = 0; i < v; ++i) for(j = 0; j < v; ++j) dis[i][j] = sqrt((p[i].first.first - p[j].first.first) * (p[i].first.first - p[j].first.first) + (p[i].first.second - p[j].first.second) * (p[i].first.second - p[j].first.second));
  ta /= 3.0, tb /= 3.0;
  for(i = 0; i < 10; ++i) sort(p, p + v, comp2);
  /*for(i = 0; i < v; ++i) printf("%d %d\n", p[i].first.first, p[i].first.second);*/
  for(i = 0; i < v; ++i)
    if(p[i].first.first > max) max = p[i].first.first, maxn = i;
  for(i = 0; i < r; ++i) {
    scanf("%d%d", &s, &t);
    s--, t--;
    vec[s].push_back(t);
    vec[t].push_back(s);
  }
  /*for(i = 0; i < v; ++i) printf("%d ", p[i].second);
  printf("\n");*/
  vector<int> ch;
  ch.push_back(maxn), ch.push_back(maxn + 1);
  for(i = maxn + 2; i < v; ++i) {
    while(ch.size() >= 2) {
      piii a = p[ch[ch.size() - 1]], b = p[ch[ch.size() - 2]];
      piii now = p[i];
      if((a.first.first - b.first.first) * (now.first.second - b.first.second) - (a.first.second - b.first.second) * (now.first.first - b.first.first) < 0) break;
      else ch.pop_back();
    }
    ch.push_back(i);
  }
  for(i = 0; i <= maxn; ++i) {
    while(ch.size() >= 2) {
      piii a = p[ch[ch.size() - 1]], b = p[ch[ch.size() - 2]];
      piii now = p[i];
      if((a.first.first - b.first.first) * (now.first.second - b.first.second) < (a.first.second - b.first.second) * (now.first.first - b.first.first)) break;
      else ch.pop_back();
    }
    ch.push_back(i);
  }
  set< pair<double, int> > q;
  int cnt = 0;
  for(i = 0; i < ch.size(); ++i) ch[i] = p[ch[i]].second;
  for(i = 1; i < ch.size(); ++i) ans += dis[ch[i]][ch[i - 1]], flg[ch[i]] = false;
  cnt = ch.size() - 1;
  /*for(i = 0; i < ch.size(); ++i) printf("%d ", ch[i]);*/
  for(i = 1; i < ch.size(); ++i) for(j = 0; j < vec[ch[i]].size(); ++j)
    q.insert(make_pair(dis[ch[i]][vec[ch[i]][j]], vec[ch[i]][j]));
  for(; cnt < v; cnt++) {
    while(!flg[(*q.begin()).second]) q.erase(q.begin());
    ans += (*q.begin()).first;
    int nowv = (*q.begin()).second;
    q.erase(q.begin());
    flg[nowv] = false;
    for(i = 0; i < vec[nowv].size(); ++i) q.insert(make_pair(dis[nowv][vec[nowv][i]], vec[nowv][i]));
  }
  printf("%lf\n", ans);
  return 0;
}


Measured memory_bytes: 3260