//最近对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));
    }
}