#include <bits/stdc++.h>
using namespace std;
#define ll int
#define rl register ll
const ll N = 210, M = 400010;
const double INF = 1e20;
ll n, m;
ll tot, h[N], e[M], ne[M];
double w[M], dis[N][2];
bool st[N][2];
struct point
{
ll x, y;
}p[N];
struct node
{
ll id; double dis; ll type;
bool operator <(const node &x) const
{
return dis > x.dis;
}
};
priority_queue<node> q;
inline double get_dist(ll a, ll b)
{
point aa = p[a], bb = p[b];
ll x = abs(aa.x - bb.x), y = abs(aa.y - bb.y);
return sqrt(x * x + y * y);
}
inline void add(ll a, ll b, double c)
{
ne[++tot] = h[a], h[a] = tot, e[tot] = b, w[tot] = c;
}
inline void dij()
{
memset(st, 0, sizeof st);
for(rl i=0; i <= n; ++ i)
dis[i][0] = dis[i][1] = INF;
dis[1][0] = dis[1][1] = 0;
q.push({1, 0, 0});
while(q.size())
{
node asd = q.top();
q.pop();
ll u = asd.id, t = asd.type;
double dist = asd.dis;
if(st[u][t]) continue;
st[u][t] = 1;
for(rl i=h[u]; ~i; i = ne[i])
{
ll v = e[i];
if(dis[v][0] > dist + w[i])
{
dis[v][1] = dis[v][0];
q.push({v, dis[v][1], 1});
dis[v][0] = dist + w[i];
q.push({v, dis[v][0], 0});
}
else if(dis[v][1] > dist + w[i])
{
dis[v][1] = dist + w[i];
q.push({v, dis[v][1], 1});
}
}
}
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m;
for(rl i=1; i <= n; ++ i)
{
ll a, b;
cin >> p[i].x >> p[i].y;
}
for(rl i=1; i <= m; ++ i)
{
ll a, b;
cin >> a >> b;
double dist = get_dist(a, b);
add(a, b, dist), add(b, a, dist);
}
dij();
if(dis[n][1] >= INF)
{
cout << "-1" << endl;
return 0;
}
printf("%.2f\n", dis[n][1]);
return 0;
}