//最近对Raid
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <cstring>
#define minn -10000
#define maxn 0x3f3f3f3f
using namespace std;
typedef long long ll;
struct node
{
int x,y;
int k;//判断是agent or station
}t[1000005];
bool cmp(node a,node b)
{
if(a.x!=b.x) return a.x<b.x;
else return a.y<b.y;
}
double dis(int a,int b)//两点之间的距离
{
return sqrt(1.0*(t[a].x-t[b].x)*(t[a].x-t[b].x)+1.0*(t[a].y-t[b].y)*(t[a].y-t[b].y));
}
double deal(int l,int r)//分治
{
if(l==r) return maxn;
int mid=(l+r)>>1;
double ans=min(deal(l,mid),deal(mid+1,r));//先算两边的最小值
for(int i=mid;i>=l;i--)//中间的最小
{
if(t[mid].x-t[i].x>ans) break;//贪心,最近的不行,后面肯定不行,直接退出循环
for(int j=mid+1;j<=r;j++)
{
if(t[j].x-t[i].x>ans) break;//同上的贪心
if(t[i].k!=t[j].k) ans=min(ans,dis(i,j));//station和agent才更新最小值
}
}
return ans;
}
int main()
{
// ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
int n;
memset(t,0,sizeof(t));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t[i].x>>t[i].y;
t[i].k=0;
}
for(int i=1+n;i<=2*n;i++)
{
cin>>t[i].x>>t[i].y;
t[i].k=1;
}
sort(t+1,t+2*n+1,cmp);//按照x关键字排序
printf("%.3f\n",deal(1,2*n));
}
}