首先為除根之外的每個點選定一條入邊,這條入邊一定要是所有入邊中最小的
除第一個點外,在另外點上找是否有向環的起點
如果有,先把環上邊權加到res中,標記環上的點,再調整有向環的起點上的入邊
調整有向環上其它點的入邊和出邊(取環上點到非環上點的最小值為環到k的值)(把環上點縮到i上)
如果找全就跳出返回最小樹形圖的值
調整的時候入邊要減掉in[u];

//pku 3164
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 110
#define M 1<<27
struct P
{
 double x, y;
}p[N];
double g[N][N],ans;
int visit[N],n,m,pre[N],circle[N],del[N];
double minn(double a, double b)
{
 return a<b?a:b;
}
double dis(P a, P b)
{
 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void dfs(int x)
{
 for(int i=1; i<=n; i++)
  if(!visit[i] && g[x][i]!=M){
   visit[i]=1;
   dfs(i);
  }
}
int exist(){//判連通
 int i,root=1;
 memset(visit, 0, sizeof(visit));
 visit[root]=true;
 dfs(root);
 for(i=1; i<=n; i++)
  if(!visit[i])
   return 0;
 return 1;
}
void S_Tree()
{
 int i,j,k,in,mark;
 memset(del, 0, sizeof(del));
 while(1){
 for(i=2; i<=n; i++)
  if(!del[i]){//找每個點的最小入度
   pre[i]=i;
   g[i][i]=M;
   for(j=1; j<=n; j++)
    if(!del[j] && g[j][i]<g[pre[i]][i]){
     pre[i]=j;
    }
  }
 for(i=2; i<=n; i++)
  if(!del[i]){
   memset(visit, 0, sizeof(visit));
   mark=i;
   while(!visit[mark] && mark!=1){//找環
    visit[mark]=1;
    mark=pre[mark];
   }
   if(mark==1) //若無環,則必會找到根節點,continue;
    continue;
   i=mark;    //否則就有環
   ans+=g[pre[i]][i];      
   for(j=pre[i]; j!=i; j=pre[j]){
    ans+=g[pre[j]][j];        //加環上的權值
    del[j]=1;
   }
   for(j=1; j<=n; j++)  //處理外界點與環上點的權值
    if(!del[j]){
     if(g[j][i]!=M)
      g[j][i]-=g[pre[i]][i];
    }
   for(j=pre[i]; j!=i; j=pre[j]){  //處理環上點與外界點的權值
    for(k=1; k<=n; k++)
     if(!del[k]){
      g[i][k]=minn(g[i][k], g[j][k]);
      if(g[k][j]!=M){
       g[k][i]=minn(g[k][i], g[k][j]-g[pre[j]][j]);
      }
     }
   }
   break;//做完一次縮點工作就跳出,繼續生成新的圖
  }
  if(i>n){
   for(j=2; j<=n; j++)
    if(!del[j]){
     ans+=g[pre[j]][j];
    }
   break;
  }
 }
}
int main()
{
 int i,j,k;
 while(scanf("%d %d",&n, &m)!=EOF){
  ans=0;
  for(i=1; i<=n; i++)
   for(j=1; j<=n; j++)
    g[i][j]=M;
  for(i=1; i<=n; i++)
   scanf("%lf %lf", &p[i].x, &p[i].y);
  for(i=0; i<m; i++){
   scanf("%d %d", &j, &k);
   g[j][k]=dis(p[j], p[k]);
  }
  i=exist();
  if(!exist())
   printf("poor snoopy\n");
  else{
   S_Tree();
   printf("%.2lf\n", ans);
  }
 }

 return 0;
}