#include<bits/stdc++.h>
using namespace std;
double n, m;
using _T=double; // 全局数据类型,可修改为 long long 等
constexpr _T eps=1e-8;
constexpr long double PI=3.1415926535897932384l;
// 点与向量
template<typename T> struct point
{
T x,y;
bool operator==(const point &a) const {return (abs(x-a.x)<=eps && abs(y-a.y)<=eps);}
bool operator<(const point &a) const {if (abs(x-a.x)<=eps) return y<a.y-eps; return x<a.x-eps;}
bool operator>(const point &a) const {return !(*this<a || *this==a);}
point operator+(const point &a) const {return {x+a.x,y+a.y};}
point operator-(const point &a) const {return {x-a.x,y-a.y};}
point operator-() const {return {-x,-y};}
point operator*(const T k) const {return {k*x,k*y};}
point operator/(const T k) const {return {x/k,y/k};}
T operator*(const point &a) const {return x*a.x+y*a.y;} // 点积
T operator^(const point &a) const {return x*a.y-y*a.x;} // 叉积,注意优先级
int toleft(const point &a) const {const auto t=(*this)^a; return (t>eps)-(t<-eps);} // to-left 测试
T len2() const {return (*this)*(*this);} // 向量长度的平方
T dis2(const point &a) const {return (a-(*this)).len2();} // 两点距离的平方
// 涉及浮点数
long double len() const {return sqrtl(len2());} // 向量长度
long double dis(const point &a) const {return sqrtl(dis2(a));} // 两点距离
long double ang(const point &a) const {return acosl(max(-1.0,min(1.0,((*this)*a)/(len()*a.len()))));} // 向量夹角
point rot(const long double rad) const {return {x*cos(rad)-y*sin(rad),x*sin(rad)+y*cos(rad)};} // 逆时针旋转(给定角度)
point rot(const long double cosr,const long double sinr) const {return {x*cosr-y*sinr,x*sinr+y*cosr};} // 逆时针旋转(给定角度的正弦与余弦)
};
template<typename T> struct line
{
point <T> p, v;
// p 为直线上一点,v 为方向向量
bool operator==(const line &a) const { return v.toleft(a.v) == 0 && v.toleft(p - a.p) == 0; }
int toleft(const point <T> &a) const { return v.toleft(a - p); }
// to-left 测试
// 涉及浮点数
point <T> inter(const line &a) const { return p + v * ((a.v ^ (p - a.p)) / (v ^ a.v)); }
// 直线交点
long double dis(const point <T> &a) const { return abs(v ^ (a - p)) / v.len(); }
// 点到直线距离
point <T> proj(const point <T> &a) const { return p + v * ((v * (a - p)) / (v * v)); }
// 点在直线上的投影
};
vector<point<double>> convexhull(vector<point<double>> p)
{
vector<point<double>> st;
sort(p.begin(),p.end());
const auto check=[](const vector<point<double>> &st,const point<double> &u)
{
const auto back1=st.back(),back2=*prev(st.end(),2);
return (back1-back2).toleft(u-back2)<=0;
};
for (const point<double> &u:p)
{
while (st.size()>1 && check(st,u)) st.pop_back();
st.push_back(u);
}
size_t k=st.size();
p.pop_back(); reverse(p.begin(),p.end());
for (const point<double> &u:p)
{
while (st.size()>k && check(st,u)) st.pop_back();
st.push_back(u);
}
st.pop_back();
return {st};
}
double check(const point<double> & u, const point<double>& v, const point<double>& p)
{
line<double> uv = { u,v - u };
if ((p - u) * (v - u) >= -eps && (p - v) * (u - v) >= -eps) return uv.dis(p);//如果点p在线段uv同一侧且投影点在uv之间那么直接返回p到uv距离
return min(p.dis(u), p.dis(v));//否则依次判断up和pv距离
}
double caliper(const vector<point<double> >& a, const vector<point<double> >& b)//凸包间最短距离,边在a旋转,在b上找对踵点
{
auto area = [](const point<double>& u, const point<double>& v, const point<double>& w) {return ((w - u) ^ (w - v)); };
int j0 = 0;
for (int j = 0; j < b.size(); j++)
{
if (area(a[0], a[1], b[j]) > area(a[0], a[1], b[j0]))j0 = j;
}
double dis = check(a[0], a[1], b[j0]);
for (int i = 0, j = j0; i < a.size(); i++)
{
int nxti = (i + 1) % a.size(), nxtj = (j + 1) % b.size();
dis = min(dis, check(a[i], a[nxti], b[j]));
while (area(a[i], a[nxti], b[nxtj]) >= area(a[i], a[nxti], b[j])-eps)
{
j = nxtj;
nxtj = (j + 1) % b.size();
dis = min(dis, check(a[i], a[nxti], b[j]));
}
}
return dis;
}
vector<point<double>> p1, p2;
/*
先得到两个凸包放于p1,p2然后对两个凸包用旋转卡壳求出p2上离p1最近的点,p1上离p2最近的点距离
*/
int main()
{
while(cin >> n >> m, n || m)
{
vector<point<double> > temp1, temp2;
for(int i = 0; i < n; i ++)
{
double x, y;
cin >> x >> y;
temp1.push_back({x, y});
}
for(int i = 0; i < m; i ++)
{
double x, y;
cin >> x >> y;
temp2.push_back({x, y});
}
p1 = convexhull(temp1);
p2 = convexhull(temp2);
printf("%.9lf\n", min(caliper(p1, p2), caliper(p2, p1)));
}
return 0;
}