#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<cstdio>
#include<complex>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
 
typedef complex<int> P;
 
namespace std{
  bool operator<(const P & a,const P & b){
    if (a.real() != b.real())return a.real() < b.real();
    return a.imag() < b.imag();
  }
}
 
const double eps = 1e-10;
 
inline double myabs(P a){
  return sqrt(a.real()*a.real() + a.imag()*a.imag());
}

inline bool is_point_online(P a,P b,P c){
  return myabs(a-c) + myabs(b-c) < myabs(a-b) + eps;
}
 
inline int dot(P a,P b){
  return a.real()*b.real() + a.imag()*b.imag();
}
 
inline int cross(P a,P b){
  return a.real()*b.imag() - a.imag()*b.real();
}
 
inline bool is_intersected_ls(P a1,P a2,P b1,P b2){
  //if ( is_point_online(a1,a2,b1))return true;
  //if ( is_point_online(a1,a2,b2))return true;
  //if ( is_point_online(b1,b2,a1))return true;
  //if ( is_point_online(b1,b2,a2))return true;
  if (  ( cross(a2-a1,b1-a1) * cross(a2-a1,b2-a1)<-eps ) && //-EPS
    ( cross(b2-b1,a1-b1)*cross(b2-b1,a2-b1)<-eps))return true;
  else return false;
}
 
inline double distance_ls_p(P a,P b,P c){
 if (dot(b-a,c-a) < eps)return myabs(c-a);
 if (dot(a-b,c-b) < eps)return myabs(c-b);
 //complex<double> aa(a.real(),a.imag());
 //complex<double> bb(b.real(),b.imag());
 //complex<double> cc(c.real(),c.imag());
 //return abs( cross(bb-aa,cc-aa))/abs(bb-aa);
 return abs( cross(b-a,c-a))/myabs(b-a);
}
 
inline double distance_ss_p(P a,P b,P c,P d){
 return min(  min( distance_ls_p(a,b,c),distance_ls_p(a,b,d)),min(distance_ls_p(c,d,a),distance_ls_p(c,d,b)));
}
 
int main(){
  int n;
  static int cnt[101][101];
  while(cin>>n){
    rep(i,101)rep(j,101)cnt[i][j] = 0;
    vector<P> a(n),b(n);
    vector<pair<P,P> > all;
    double ans = 1e10;
    rep(i,n){
      int y,x,y2,x2;
      scanf("%d%d",&x,&y);
      cnt[y][x]++;
      a[i] = P(x,y);
      scanf("%d%d",&x2,&y2);
      cnt[y2][x2]++;
      b[i] = P(x2,y2);
    }
    rep(i,101){
      rep(j,101){
	if (cnt[i][j] > 1){ans = 0;goto end;}
      }
    }
    rep(i,n){
      REP(j,i+1,n)if (is_intersected_ls(a[i],b[i],a[j],b[j])){ans = 0;goto end;}
    }
    rep(i,n)all.push_back(make_pair(a[i],b[i]));
    sort(all.begin(),all.end());
    rep(i,all.size()){
      REP(j,i+1,all.size()){
	ans = min(ans,distance_ss_p(all[i].first,all[i].second,all[j].first,all[j].second));
      }
    }
  end:;
    printf("%.10lf\n",ans);
  }
  return 0;
}