#include <iostream>#include <cstring>#include <cmath>#include <iomanip>#include <cstdio>using namespace std;#define INF 999999999#define MIN(x, y) ((x) < (y) ? (x) : (y))int villageX[101], villageY[101];double dis[101][101];bool exist[101];bool vis[101];//for DFS, judge if visitedint pre[101];int nv, ne;//number of vertexs and edgesvoid init();void solve();double zhuliu();double dist(int a, int b);void dfs(int t);int main(void){ while (1) { init(); if (!(cin >> nv >> ne)) break; for (int i = 1; i <= nv; i++) cin >> villageX[i] >> villageY[i]; for (int i = 1; i <= ne; i++) { int a, b; cin >> a >> b; if (a != b && b != 1)//ensure no self-loop dis[a][b] = dist(a, b); } solve(); } return 0;}void init(){ for (int i = 1; i <= 100; i++) for (int j = 1; j <= 100; j++) dis[i][j] = INF; for (int i = 1; i <= 100; i++) exist[i] = true; memset(villageX, 0, sizeof(villageX)); memset(villageY, 0, sizeof(villageY)); memset(vis, 0, sizeof(vis));}void solve(){ double t = zhuliu(); if (t < 0.0) cout << "poor snoopy" << endl; else cout << setprecision(2) << setiosflags(ios::fixed) << t << endl;}double zhuliu(){ double res = 0.0; //judge possiblity dfs(1); for (int i = 1; i <= nv; i++) if (!vis[i]) return -1.0; while (1) { //search for minimum previous edge for (int i = 2; i <= nv; i++) { if (!exist[i]) continue; double min = INF; for (int j = 1; j <= nv; j++) if (exist[j] && dis[j][i] < min) { min = dis[j][i]; pre[i] = j; } } //search for loop int loopEntry = 0; for (int i = 2; i <= nv; i++) { int j = i; int count = 0; if (!exist[i]) continue; while (count <= nv) { count++; j = pre[j]; if (j == i) {loopEntry = i; break;} if (j == 1) break; } if (loopEntry) break; } if (!loopEntry)//no loop any more { for (int i = 2; i <= nv; i++) if (exist[i]) res += dis[pre[i]][i]; return res; } //delete loop memset(vis, 0, sizeof(vis)); int k = loopEntry; do { res += dis[pre[k]][k]; exist[k] = false; vis[k] = true; k = pre[k]; }while (k != loopEntry); exist[loopEntry] = true; for (int i = 1; i <= nv; i++) if (vis[i])//in the loop for (int j = 1; j <= nv; j++) if (!vis[j])//out of the loop { if (dis[i][j] != INF) dis[loopEntry][j] = MIN(dis[loopEntry][j], dis[i][j]); if (dis[j][i] != INF) dis[j][loopEntry] = MIN(dis[j][loopEntry], dis[j][i] - dis[pre[i]][i]); } }}double dist(int a, int b)//distance{ double dx = villageX[a] - villageX[b]; double dy = villageY[a] - villageY[b]; return sqrt(dx*dx + dy*dy);}void dfs(int t){ vis[t] = true; for (int i = 1; i <= nv; i++) if (dis[t][i] < INF && !vis[i]) dfs(i);}