//zoj1914kruscal求出最小生成树,
输出第S大的边的权值//我了个去的,
为嘛一直Segmentation Fault 真不爽!不爽!!
//还请大牛指点
#include "stdio.h"
#include <math.h>
#include <stdlib.h>
FILE *fp=fopen("D:\\input.txt","r+");
typedef struct point
{
int x,y;
}points;
points p[505];
typedef struct side
{
int s,e;
double v;
}sides;
sides snum[25005];
int cases,S,P,flag[505],k;
void input()
{
fscanf(fp,"%d%d",&S,&P);
int i,j;
k=0;
for(i=0;i<P;i++)
{
fscanf(fp,"%d%d",&p[i].x,&p[i].y);
}
for(i=0;i<P-1;i++)
for(j=i+1;j<P;j++)
{
snum[k].s=i;
snum[k].e=j;
snum[k].v=(p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y);
k++;
}
}
int cmp(const void *a,const void *b)
{
sides *a1,*b1;
a1=(sides*)a;b1=(sides*)b;
if( a1->v>b1->v)
return 1;
else return -1;
}
int find(int i)
{
while(flag[i]!=i)
i=flag[i];
return i;
}
int kruscal()
{
int flag1,flag2,i,count=1;
doubletree[505];
qsort(snum,k,sizeof(sides),cmp);
for(i=0;i<505;i++)
flag[i]=i;
for(i=0;i<k;i++)
{
flag1=find(snum[i].s);
flag2=find(snum[i].e);
if(flag1!=flag2)
{
tree[count++]=snum[i].v;
flag[flag1]=flag2;
if(count==P)
break;
}
}
printf("%.2lf\n",sqrt(tree[P-S]));
return 0;
}
int main ()
{
fscanf(fp,"%d",&cases);
while(cases--)
{
input();
kruscal();
}
return 0;
}