#include <iostream>
#include <cstdio>
#include <vector>
#include <complex>
#include <cmath>
#include <ctime>
#include <algorithm>
using namespace std;

// * XYテ・ツコツァテヲツィツ?
#define X real()
#define Y imag()

// * テァツつケテ」ツ?ョティツ。ツィテァツ渉セ
typedef complex<double> P;

// * ティツィツアテ・ツョツケテ」ツ?凖」ツつ凝ィツェツ、テ・ツキツョテ篠オ
const double EPS = 1e-10;
// * Infinity
const double INF = 1e12;
// * テ・ツ??・ツ堕ィテァツ篠?
const double PI = acos(-1.0);
// * 
const P INF_P(INF,INF);

// * complex<double> テ」ツ?ョテゥツ??・ツコツ湘」ツつ津・ツョツ堙ァツセツゥテ」ツ?凖」ツつ?
namespace std {
	bool operator < (const P& a, const P& b) {
		return (real(a) != real(b))? real(a) < real(b) : imag(a) < imag(b);
	}
}

// * テァツつケテ・ツコツァテヲツィツ凖」ツ?ョテ」ツδ?」ツδ静」ツδε」ツつーテ・ツ?コテ・ツ環?
void print(P p) {
	p.X += 200;
	p.Y += 200;
	cout << "point" << p << ";" << endl;
}

// * 2テ、ツケツ療」ツ?凖」ツつ?
double sq(double x) {
	return x * x;
}

// * 2テァツつケテゥツ鳴禿」ツ?ョティツキツ敕ゥツ崢「
double dist(P p1, P p2) {
	return abs(p1 - p2);
}

// * 2テ」ツ?、テ」ツ?ョテ」ツつケテ」ツつォテ」ツδゥテ」ツδシテ」ツ?古ァツュツ嘉」ツ?療」ツ??」ツ?凝」ツ?ゥテ」ツ??」ツ??
bool equal(double a, double b) {
	return ( fabs( a - b ) < EPS );
}
// * 2テ」ツ?、テ」ツ?ョテ」ツδ凖」ツつッテ」ツδ暗」ツδォテ」ツ?古ァツュツ嘉」ツ?療」ツ??」ツ?凝」ツ?ゥテ」ツ??」ツ??
bool eq_v(P a, P b) {
	return ( equal( a.X, b.X ) && equal( a.Y, b.Y ) );
}

// テ」ツδ凖」ツつッテ」ツδ暗」ツδォ a テ」ツ?ョテ・ツ債佚、ツスツ催ヲツウツ陛ァツキツ堙」ツδ凖」ツつッテ」ツδ暗」ツδォテ」ツつ津ヲツアツづ」ツつ?」ツつ?
vector<P> normal_unit(P a) {
	vector<P> vp;
	vp.push_back( (a * P(0,  1)) / abs(a) );
	vp.push_back( (a * P(0, -1)) / abs(a) ) ;
	return vp;
}

// * テ・ツ??ァツゥツ?(dot product) : aテ」ツδサb = |a||b|cosテ篠?
double dot(P a, P b) {
	return real( conj(a) * b );
}

// * テ・ツ、ツ姪ァツゥツ?(cross product) : aテδ傭 = |a||b|sinテ篠?
double cross(P a, P b) {
	return imag( conj(a) * b ) ;
}

// CCW : テ・ツ渉催ヲツ卍づィツィツ暗・ツ崢榲」ツつ?(Counter Clock Wise)
// CW : テヲツ卍づィツィツ暗・ツ崢榲」ツつ?(Clock Wise)
enum {CCW=1, CW=-1, ON=0};
// * 3テァツつケテ」ツ?古」ツ?ゥテ」ツ?。テ」ツつ嘉・ツ崢榲」ツつ甘」ツ?ァテ」ツ?づ」ツつ凝」ツ?凝ィツソツ氾」ツ?? 3テァツつケテ」ツ??テァツ崢エテァツキツ堙」ツ?ォテ、ツケツ療」ツ?」テ」ツ?ヲテ」ツ??」ツつ凝」ツ?ィテ」ツ?催」ツ?ッ ON テ」ツつ津ィツソツ氾」ツ??
int ccw(const P &a, P b, P c) {
	b-=a, c-=a;
	double rotdir = cross(b,c);
	if( rotdir >  EPS ) return CCW;
	if( rotdir < -EPS ) return CW;
	return ON;
}

// テ」ツδゥテ」ツつクテ」ツつ「テ」ツδウテ」ツ?凝」ツつ嘉・ツコツヲテヲツ閉ーテ」ツ?クテ・ツ、ツ嘉ヲツ渉崚」ツ?療」ツ?ヲティツソツ氾」ツ??
double to_deg(double rad) {
	return rad * 180.0 / PI;
}

// テ・ツコツヲテヲツ閉ーテ」ツ?凝」ツつ嘉」ツδゥテ」ツつクテ」ツつ「テ」ツδウテ」ツ?ォテ・ツ、ツ嘉ヲツ渉崚」ツ?療」ツ?ヲティツソツ氾」ツ??
double to_rad(double deg) {
	return deg * PI / 180.0;
}

// テ・ツ篠淌ァツつケテ」ツつ津ィツサツクテ」ツ?ォテァツつケ p テ」ツつ津ィツァツ津・ツコツヲ a (テ」ツδゥテ」ツつクテ」ツつ「テ」ツδウ)テ」ツ??」ツ?妥・ツ崢榲ィツサツ「テ」ツ?陛」ツ?崚」ツ?淌ァツつケテ」ツつ津ィツソツ氾」ツ??
P rot(P p, double a){
	double x = p.X * cos(a) - p.Y * sin(a);
	double y = p.X * sin(a) + p.Y * cos(a);
	return P(x,y);
}

// テァツつケ a テ」ツつ津ィツサツクテ」ツ?ォテァツつケ b テ」ツつ津ィツァツ津・ツコツヲ a (テ」ツδゥテ」ツつクテ」ツつ「テ」ツδウ)テ」ツ??」ツ?妥・ツ崢榲ィツサツ「テ」ツ?陛」ツ?崚」ツ?淌ァツつケテ」ツつ津ィツソツ氾」ツ??
P rot2(P a, P b, double angle){
	P p = b - a;
	return rot( p , angle ) + a;
}

// テァツキツ堙・ツ按?」ツ?ョティツ。ツィテァツ渉セ
struct Segment{
	// テァツつケ a, b テ」ツつ津ァツォツッテァツつケテ」ツ?ィテ」ツ?凖」ツつ凝ァツキツ堙・ツ按?
	P a, b;
	// テ」ツつウテ」ツδウテ」ツつケテ」ツδ暗」ツδゥテ」ツつッテ」ツつソテ」ツ?ァテ・ツ按敕ヲツ慊淌・ツ個?
	Segment(P a_, P b_) {
		a = a_; b = b_;
	}
	// テァツキツ堙・ツ按?」ツ?ョテゥツ閉キテ」ツ?陛」ツつ津ィツソツ氾」ツ??
	double length() { return abs(a-b); }
	// テ、ツクツュテァツつケテ」ツつ津ィツソツ氾」ツ??
	P mid() { return P( (a.X+b.X)/2.0 , (a.Y+b.Y)/2.0 ); }
	// テァツつケ p テ」ツ?古ァツキツ堙・ツ按?、ツクツ甘」ツ?ォテ」ツ?づ」ツつ凝」ツ?凝」ツ?ゥテ」ツ??」ツ??
	bool contain(P p) { return (abs(a-p) + abs(p-b) < abs(a-b) + EPS); }
	// テァツキツ堙・ツ按?」ツ?ィテァツつケ p テ」ツ?ョティツキツ敕ゥツ崢「
	double distance(P p) {
		if( dot(b-a, p-a) < EPS ) return abs(p-a);
		if( dot(a-b, p-b) < EPS ) return abs(p-b);
		return abs(cross(b-a, p-a)) / abs(b-a);
	}
	// テァツキツ堙・ツ按?」ツ?ョテ、ツコツ、テ・ツキツョテ・ツ按、テ・ツョツ?
	bool is_intersection(const Segment& s) {
		return ( cross(b-a, s.a-a) * cross(b-a, s.b-a) < EPS ) &&
			   ( cross(s.b-s.a, a-s.a) * cross(s.b-s.a, b-s.a) < EPS );
	}
	// テァツキツ堙・ツ按?」ツ?ョテ、ツコツ、テ・ツキツョテ・ツ按、テ・ツョツ堙」ツ?ィテ、ツコツ、テァツつケティツィツ暗ァツョツ?
	bool intersection(Segment s, P& p) {
		bool result = is_intersection( s );
		if( result ) {
			double d1 = abs( cross(s.b-s.a, a-s.a) );
			double d2 = abs( cross(s.b-s.a, b-s.a) );
			
			if( abs(d1) < EPS && abs(d2) < EPS ) { // 2テ」ツ?、テ」ツ?ョテァツキツ堙・ツ按?」ツ?古・ツ青古」ツ?佚ァツ崢エテァツキツ堙、ツクツ甘」ツ?ォテ」ツ?づ」ツつ凝」ツ?ィテ」ツ??
				if( this->contain(s.a) ) {
					p = s.a;
				}else if( this->contain(s.b) ) {
					p = s.b;
				}else if( s.contain( a ) ) {
					p = a;
				}else if( s.contain( b ) ) {
					p = b;
				}else {
					p = INF_P;
				}
			}else if( abs(d1) < EPS ) {
				p = INF_P;
			}else {
				double t = d1 / (d1 + d2);
				p = a + (b-a) * t;
			}
		}else{
			p = INF_P;
		}
		return result;
	}
	// テァツキツ堙・ツ按?」ツ?ィテァツキツ堙・ツ按?」ツ?ョティツキツ敕ゥツ崢「
	double distance(Segment s) {
		if( this->is_intersection( s ) ) { // テ、ツコツ、テ・ツキツョテ」ツ?凖」ツつ凝」ツ?ィテ」ツ??
			double d1 = abs( cross(s.b-s.a, a-s.a) );
			double d2 = abs( cross(s.b-s.a, b-s.a) );
			
			if( abs(d1) < EPS && abs(d2) < EPS ) { // 2テ」ツ?、テ」ツ?ョテァツキツ堙・ツ按?」ツ?古・ツ青古」ツ?佚ァツ崢エテァツキツ堙、ツクツ甘」ツ?ォテ」ツ?づ」ツつ凝」ツ?ィテ」ツ??
				if( this->contain(s.a) || this->contain(s.b) ) {
					return 0.0;
				}else if( s.contain( a ) || s.contain( b ) ) {
					return 0.0;
				}
			}else{
				return 0.0;
			}
		}
		double A = this->distance(s.a);
		double B = this->distance(s.b);
		double C = s.distance( (*this).a );
		double D = s.distance( (*this).b );
		return min( min(A,B) , min(C,D) );
	}
	// テァツつケ p テ」ツつ津ィツサツクテ」ツ?ォ テァツキツ堙・ツ按?テ」ツつ?ティツァツ津・ツコツヲ angle テ」ツ??」ツ?妥・ツ崢榲ィツサツ「テァツァツサテ・ツ仰?(ティツァツ津・ツコツヲテ」ツ?ッテ」ツδゥテ」ツつクテ」ツつ「テ」ツδウ)
	Segment rot(P p, double angle) {
		P a_ = rot2( p , a , angle );
		P b_ = rot2( p , b , angle );
		return Segment( a_ , b_ );
	}
	// テ」ツδ?」ツδ静」ツδε」ツつーテ・ツ?コテ・ツ環?
	void print() { printf("line(%f,%f,%f,%f); \n", a.X+200, a.Y+200, b.X+200, b.Y+200 ); }
};
// Segment テ」ツ?ョテゥツ??・ツコツ湘」ツつ津・ツョツ堙ァツセツゥ (xテ・ツコツァテヲツィツ凖」ツ?ョテ・ツーツ湘」ツ?陛」ツ??ァツォツッテァツつケテ」ツ?ァテヲツッツ氾ィツシツ?
bool operator < (const Segment& s1, const Segment& s2) { return s1.a < s2.a; }

// テァツ崢エテァツキツ堙」ツ?ョティツ。ツィテァツ渉セ ((*this)[0]) テ」ツ?ィ ((*this)[1]) テ」ツつ津ゥツ?堙」ツつ凝ァツ崢エテァツキツ?
struct Line : public vector<P> {
	Line(const P &a, const P &b) {
		push_back(a); push_back(b);
	}
	Line(vector<P> v){
		push_back(v[0]); push_back(v[1]);
	}
	Line(){}
	// 2テァツ崢エテァツキツ堙」ツ?ョテァツ崢エテ、ツコツ、テ・ツ按、テ・ツョツ?
	bool orthogonal(const Line& l) {
		return equal( dot( (*this)[0] - (*this)[1] , l[0] - l[1] ) , 0.0 );
	}
	// 2テァツ崢エテァツキツ堙」ツ?ョテ・ツケツウティツ。ツ古・ツ按、テ・ツョツ?
	bool parallel(const Line& l) {
		return equal( cross( (*this)[0] - (*this)[1] , l[0] - l[1] ), 0.0 );
	}
	// テァツつケ p テ」ツ?古ァツ崢エテァツキツ堙、ツクツ甘」ツ?ォテ、ツケツ療」ツ?」テ」ツ?ヲテ」ツ??」ツつ凝」ツ??
	bool contain(P p) {
		return equal( cross( (*this)[1] - (*this)[0] , p - (*this)[0] ) , 0.0 );
	}
	// テァツ崢エテァツキツ堙」ツ?ィテァツつケ p テ」ツ?ョティツキツ敕ゥツ崢「
	double distance(P a) {
		P p1 = (*this)[0];
		P p2 = (*this)[1];
		return abs( cross( p2 - p1 , a - p1) ) / abs(p2 - p1);
	}
	// テァツ崢エテァツキツ堙」ツ?ョテ、ツコツ、テ・ツキツョテ・ツ按、テ・ツョツ?
	bool is_intersection(const Line& l) {
		return !equal( cross( (*this)[0] - (*this)[1], l[0] - l[1] ) , 0.0 );
	}
	// テァツ崢エテァツキツ堙」ツ?ョテ、ツコツ、テ・ツキツョテ・ツ按、テ・ツョツ堙」ツ?ィテ、ツコツ、テァツつケティツィツ暗ァツョツ?
	bool intersection(Line l, P& p) {
		bool result = this->is_intersection( l );
		if( result ) {
			P a = (*this)[1] - (*this)[0];
			P b = l[1] - l[0];
			p = (*this)[0] + a * cross(b, l[0] - (*this)[0]) / cross(b, a);
		}else {
			p = INF_P;
		}
		return result;
	}
	// ティツァツ津・ツコツヲテ」ツつ津ィツソツ氾」ツ??[-テ渉?テ渉?
	double get_dir() {
		P p = (*this)[0] - (*this)[1];
		return atan2( p.Y , p.X );
	}
	// テ・ツ渉古・ツッツセテ・ツ、ツ嘉ヲツ渉?
	P dual(const Line &l) {
		const P p = l[0], q = l[1];
		return P( imag(p - q) / real(p - q), cross(p, q) / real(q - p) );
	}
	// テァツつケテ」ツつ津ァツキツ堙・ツッツセテァツァツーテ」ツ?ォテァツァツサテ・ツ仰陛」ツ?陛」ツ?崚」ツつ?
	P symmetry(P a) {
		double x,y;
		double x1 = (*this)[0].X;
		double x2 = (*this)[1].X;
		double y1 = (*this)[0].Y;
		double y2 = (*this)[1].Y;
		double xq = a.X;
		double yq = a.Y;
		if( x2 == x1 ) {
			x = -xq;
			y = yq;
		}else{
			double m = (y2 - y1) / (x2 - x1);
			double c = y2 - m * x2;
			x = (2 * m * yq - xq * (m * m - 1) - 2 * m * c) / (m * m + 1);
		    y = (2 * m * xq + yq * (m * m - 1) + 2 * c) / (m * m + 1);
		}
		return P(x,y);
	}
	// テァツつケ p テ」ツつ津ィツサツクテ」ツ?ォ テァツ崢エテァツキツ?テ」ツつ?ティツァツ津・ツコツヲ angle テ」ツ??」ツ?妥・ツ崢榲ィツサツ「テァツァツサテ・ツ仰?(ティツァツ津・ツコツヲテ」ツ?ッテ」ツδゥテ」ツつクテ」ツつ「テ」ツδウ)
	Line rot(P p, double angle) {
		P a = rot2( p , (*this)[0] , angle );
		P b = rot2( p , (*this)[1] , angle );
		return Line( a , b );
	}
	// テ」ツδ?」ツδ静」ツδε」ツつーテ・ツ?コテ・ツ環?
	void print() {
		P p1 = (*this)[0];
		P p2 = (*this)[1];
		double dx = p1.X - p2.X;
		double dy = p1.Y - p2.Y;
		::print( p1 );
		::print( p2 );
		p1.X += 100 * dx;
		p1.Y += 100 * dy;
		p2.X -= 100 * dx;
		p2.Y -= 100 * dy;
		p1.X += 200; p1.Y += 200;
		p2.X += 200; p2.Y += 200;
		Segment s( p1 , p2 );
		s.print();
	}
};

// テ、ツクツ嘉ィツァツ津・ツスツ「テ」ツ?ョティツ。ツィテァツ渉セ
struct Triangle{
private:
	// テ、ツスツ凖・ツシツヲテ・ツョツ堙ァツ青?」ツ?凝」ツつ?3 テ」ツ?、テ」ツ?ョティツァツ津」ツ?ョティツァツ津・ツコツヲテ」ツつ津ヲツアツづ」ツつ?」ツつ?(テ・ツ??ゥツδィテ」ツ?ョテゥツ鳴「テヲツ閉ーテ」ツ?ァテ、ツスツソテァツ板ィ)
    double law_of_cos(double a, double b, double c) {
        return acos( (b*b + c*c - a*a) / (2.0 * b * c) );
    }
public:
	// 3 テ」ツ?、テ」ツ?ョテゥツ?づァツつケ
	P a, b, c;
    // 3 テ」ツ?、テ」ツ?ョティツセツコテ」ツ?ョテゥツ閉キテ」ツ??
    double edgeA, edgeB, edgeC;
    // 3 テ」ツ?、テ」ツ?ョティツァツ津」ツ?ョティツァツ津・ツコツヲ (テ」ツδゥテ」ツつクテ」ツつ「テ」ツδウ)
    double angleA,angleB,angleC;
    
    // テ」ツつウテ」ツδウテ」ツつケテ」ツδ暗」ツδゥテ」ツつッテ」ツつソテ」ツ?ァテ・ツ按敕ヲツ慊淌・ツ個?
    Triangle(P p1, P p2, P p3) {
        a = p1;
        b = p2;
        c = p3;
        edgeB = abs(c-a);
        edgeA = abs(b-c);
        edgeC = abs(a-b);
        angleA = law_of_cos( edgeA, edgeB, edgeC );
        angleB = law_of_cos( edgeB, edgeC, edgeA );
        angleC = law_of_cos( edgeC, edgeA, edgeB );
    }
    // テ、ツクツ嘉ィツァツ津・ツスツ「テ」ツ?ョテゥツ敖「テァツゥツ催」ツつ津ィツソツ氾」ツ??(テ」ツδ佚」ツδュテ」ツδウテ」ツ?ョテ・ツ?ャテ・ツシツ?
	double get_area() {
		double s = 0.5 * (edgeA + edgeB + edgeC);
		return sqrt( s * (s - edgeA) * (s - edgeB) * (s - edgeC) );
	}
	// テ、ツクツ嘉ィツァツ津・ツスツ「テ」ツ?ョテゥツ?催・ツソツε」ツつ津ィツソツ氾」ツ??
	P gravity() {
		return P( (a.X + b.X + c.X) / 3.0 , (a.Y + b.Y + c.Y) / 3.0 );
	}
	// テァツつケ p テ」ツ?古、ツクツ嘉ィツァツ津・ツスツ「テ」ツ?ョティツセツコテ、ツクツ甘」ツ?ォテ」ツ?づ」ツつ凝」ツ?凝」ツ?ゥテ」ツ??」ツ??
	bool on_boundary(P p) {
		Segment AB(a,b), BC(b,c), CA(c,a);
		return (AB.contain( p ) || BC.contain( p ) || CA.contain( p ) );
	}
	// テァツつケ p テ」ツ?古、ツクツ嘉ィツァツ津・ツスツ「テ」ツ?ョテ・ツ??ゥツδィテ」ツ?ォテ」ツ?づ」ツつ凝」ツ?凝」ツ?ゥテ」ツ??」ツ??( AOJ 0012 テ」ツ?ァテヲツ、ツ愿ィツィツシテヲツクツ暗」ツ?ソ )
	// テァツつケ p テ」ツ?古、ツクツ嘉ィツァツ津・ツスツ「テ」ツ?ョティツセツコテ、ツクツ?or テゥツ?づァツつケテ、ツクツ?テ」ツ?ォテ」ツ?づ」ツつ凝」ツ?ィテ」ツ?催」ツ?ッティツェツ、テ・ツキツョテ」ツ?ァテヲツュツ」テ」ツ?療」ツ??ァツオツ静ヲツ楪愿」ツ?古ィツソツ氾」ツ?」テ」ツ?ヲテ」ツ?禿」ツ?ェテ」ツ??」ツ?ョテ」ツ?ァテヲツウツィテヲツ??!!
	bool is_inside(P p) {
		// ティツセツコテ、ツクツ甘」ツ?ォテ」ツ?づ」ツつ凝」ツ?ィテ」ツ??
		if( this->on_boundary(p) ) return true;
		
		Triangle t1( a , b , p );
		Triangle t2( b , c , p );
		Triangle t3( c , a , p );
		// ティツァツ但PB + ティツァツ達PB + ティツァツ辰PA テ」ツ??360テ・ツコツヲテ」ツ?ェテ」ツつ?テァツつケ p テ」ツ?ッテ、ツクツ嘉ィツァツ津・ツスツ「テ」ツ?ョテ・ツ??ゥツδィテ」ツ?ォテ」ツ?づ」ツつ?
		return equal( t1.angleC + t2.angleC + t3.angleC , 2.0*PI );
	}
	// テァツつケ p テ」ツつ津ィツサツクテ」ツ?ォ テ、ツクツ嘉ィツァツ津・ツスツ「 テ」ツつ?ティツァツ津・ツコツヲ angle テ」ツ??」ツ?妥・ツ崢榲ィツサツ「テァツァツサテ・ツ仰?(ティツァツ津・ツコツヲテ」ツ?ッテ」ツδゥテ」ツつクテ」ツつ「テ」ツδウ)
	Triangle rot(P p, double angle) {
		P a_ = rot2( p , a , angle );
		P b_ = rot2( p , b , angle );
		P c_ = rot2( p , c , angle );
		return Triangle( a_ , b_ , c_ );
	}
	// テ」ツδ?」ツδ静」ツδε」ツつーテ・ツ?コテ・ツ環?
	void print() {
		Segment AB(a,b);
		Segment BC(b,c);
		Segment CA(c,a);
		AB.print();
		BC.print();
		CA.print();
	}
};


// テ・ツ?クテ・ツ、ツ堙ィツァツ津・ツスツ「テ」ツ?凝」ツ?ゥテ」ツ??」ツ??(テ、ツクツ嘉ィツァツ津・ツスツ「テ」ツ?ォテ・ツ按?・ツ可イテ」ツ?療」ツ?ヲテ」ツ?凖」ツ?ケテ」ツ?ヲテ」ツ?ョテ、ツクツ嘉ィツァツ津・ツスツ「テ」ツ?古・ツ渉催ヲツ卍づィツィツ暗・ツ崢榲」ツつ甘」ツ?凝ィツェツソテ」ツ?ケテ」ツつ?
bool is_convex(vector<P> g) {
	for(int i=2 ; i < g.size() ; i++ ){
		if( ccw( g[0] , g[i-1] , g[i] ) != CCW ) return false;
	}
	return true;
}

// テ・ツ、ツ堙ィツァツ津・ツスツ「テ」ツ?ョティツ。ツィテァツ渉セ (テ・ツ?クテ・ツ、ツ堙ィツァツ津・ツスツ「テ」ツ?ィテ、ツサツョテ・ツョツ堙」ツ?凖」ツつ?
struct Polygon{
	// テゥツ?づァツつケテ」ツ?ョテゥツ崢?」ツ?セテ」ツつ?
	vector<P> g;
	// テ」ツつウテ」ツδウテ」ツつケテ」ツδ暗」ツδゥテ」ツつッテ」ツつソテ」ツ?ァテ・ツ按敕ヲツ慊淌・ツ個?
	Polygon(vector<P> g_){ g = g_; }
	Polygon(){}
	// テァツつケ p テ」ツ?古・ツ?クテ・ツ、ツ堙ィツァツ津・ツスツ「テ」ツ?ョテ・ツ??ゥツδィテ」ツ?ォテ」ツ?づ」ツつ凝」ツ?凝」ツ?ゥテ」ツ??」ツ??
	bool is_inside(P p) {
		for(int i=2 ; i < g.size() ; i++ ) {
			Triangle t( g[0] , g[i-1] , g[i] );
			if( t.is_inside( p ) ) {
				return true;
			}
		}
		return false;
	}
	// テァツつケ p テ」ツ?古・ツ?クテ・ツ、ツ堙ィツァツ津・ツスツ「テ」ツ?ョティツセツコテ、ツクツ甘」ツ?ォテ」ツ?づ」ツつ凝」ツ?凝」ツ?ゥテ」ツ??」ツ??
	bool on_boundary(P p) {
		for(int i=0 ; i < g.size() ; i++ ) {
			Segment s( g[i] , g[(i+1) % g.size()] );
			if( s.contain( p ) ) return true;
		}
		return false;
	}
	// テ・ツ?クテ・ツ、ツ堙ィツァツ津・ツスツ「テ」ツ?ョテゥツ敖「テァツゥツ催」ツつ津ィツソツ氾」ツ??
	double get_area() {
		double s = 0.0;
		for(int i=2 ; i < g.size() ; i++ ) {
			s += cross( g[i-1] - g[0] , g[i] - g[0] );
		}
		return s/2.0;
	}
	// テ・ツ?クテ・ツ、ツ堙ィツァツ津・ツスツ「テ」ツ?ョテゥツ?催・ツソツε」ツつ津ィツソツ氾」ツ??
	P gravity() {
		P sg(0,0);
		double s = 0.0;
		for(int i=2 ; i < g.size() ; i++ ) {
			Triangle t( g[0] , g[i-1] , g[i] );
			s += t.get_area();
			sg += t.get_area() * t.gravity();
		};
		return sg / s;
	}
	// テ・ツ?クテ・ツ、ツ堙ィツァツ津・ツスツ「テ」ツ?ョテァツ崢エテ・ツセツ?」ツつ津ィツソツ氾」ツ??(テヲツ慊?ゥツ??ァツつケテ・ツッツセテ」ツ?ッテ・ツシツ陛ヲツ閉ーテ」ツ?ョpair<P,P> pテ」ツ?ォテ、ツサツ」テ・ツ?・)
	double convex_diameter(pair<P,P>& p) {
    	double result = 0.0;
    	for(int i=0 ; i < g.size() ; i++ ){
    		for(int j = i+1 ; j < g.size() ; j++ ){
    			 if( result < dist( g[i] , g[j] ) ){
    			 	result = dist( g[i] , g[j] );
    			 	p = pair<P,P>( g[i] , g[j] );
    			 }
    		}
    	}
    	return result;
	}
	// テ・ツ?クテ・ツ、ツ堙ィツァツ津・ツスツ「 テ」ツつ?テァツ崢エテァツキツ嗟 テ」ツ?ァテ・ツ按?ヲツ鳴ュテ」ツ?療」ツ??ァツ崢エテァツキツ堙」ツ?ョテ・ツキツヲテ・ツ?エテ」ツ?ョテ・ツ、ツ堙ィツァツ津・ツスツ「テ」ツつ津ィツソツ氾」ツ??
	Polygon convex_cut(Line l) {
  		vector<P> Q;
  		for(int i = 0; i < g.size() ; i++ ) {
    		P A = g[i];
    		P B = g[(i+1) % g.size()];
    		if( ccw( l[0] , l[1] , A ) != CW ) {
    			Q.push_back( A );
    		}
    		if( ccw( l[0] , l[1] , A ) * ccw( l[0] , l[1] , B ) < 0 ) {
    			Line AB( A , B );
    			P p;
    			AB.intersection( l , p );
     			Q.push_back( p );
     		}
  		}
 		return Polygon( Q );
	}
	// テァツ崢エテァツキツ?s テ」ツ?ョテヲツ鳴ケテ・ツ青? s.a テ」ツ?凝」ツつ?s.b テ」ツ?クテ」ツ?ョテ」ツδ凖」ツつッテ」ツδ暗」ツδォ ) テ」ツ?ィ テヲツ慊?」ツつづゥツ??」ツ??ァツつケテ」ツつ津ィツソツ氾」ツ??
	double d(int k, const Segment& s) { return dot( g[k] , s.b - s.a ) ;}
	P convex_extreme(const Segment& s) {
		int a = 0;
		int b = g.size();
		int n = g.size();
		if( d(0,s) >= d(n-1,s) && d(0,s) >= d(1,s) )
			return g[0];
		while( a < b ) {
			int c = (a + b) / 2;
			if( d(c,s) >= d(c-1,s) && d(c,s) >= d(c+1,s) )
				return g[c];
			if( d(a+1,s) > d(a,s) ){
				if( d(c+1,s) <= d(c,s) || d(a,s) > d(c,s) )
					b = c;
				else
					a = c;
			}else{
	      		if( d(c+1,s) > d(c,s) || d(a,s) >= d(c,s) )
	      			a = c;
	      		else
	      			b = c;
	      	}
		}
	}
	// テ」ツδ?」ツδ静」ツδε」ツつーテァツ板ィテ・ツ?コテ・ツ環?
	void print() {
		for(int i=0 ; i < g.size() ; i++ ) {
			Segment s( g[i] , g[(i+1) % g.size()] );
			s.print();
		}
	}
};

// テ、ツケツアテヲツ閉ーテ」ツ?ョテァツィツョテ」ツ?ョテ・ツ按敕ヲツ慊淌・ツ個?(テヲツ慊?・ツ按敕」ツ?ォ1テ・ツ崢榲」ツ??」ツ?妥・ツ堕シテ」ツ?ウテ・ツ?コテ」ツ??
void init_rand(){
    srand((unsigned int)time(NULL));
}

// [a,b] テ」ツ?ョテゥツ敖榲ィツイツ?ヲツ閉エテヲツ閉ーテ」ツつ津ィツソツ氾」ツ?凖」ツ??(a,bテ」ツ?ッテゥツ敖榲ィツイツ?ヲツ閉エテヲツ閉ー)
int random(int a, int b){
	int range = b - a + 1;
    return rand() % range + a;
}

// [0,1] テ」ツ?ョテヲツオツョテ・ツ仰陛・ツーツ湘ヲツ閉ーテ」ツつ津ィツソツ氾」ツ??
double random_2(){
	return (double)rand() / RAND_MAX ;
}


int main(){
	init_rand();
	
	int n;
	while( scanf("%d", &n), n ){
		vector<P> v;
		for(int i=0 ; i < n ; i++ ){
			int x, y;
			scanf("%d %d", &x, &y );
			v.push_back( P(x,y) );
		}
		Polygon G( v );
		double s = G.get_area();
		
		double low=PI*0.5, high=PI*1.5, mid=PI/2;
		bool flag1=false, flag2=false;
		for(int i=0 ; i < 100 ; i++ ){
			if( flag1 && flag2 ) break;
			
			mid = random_2() * 2.0 * PI ;
			Line l( P(0,0) , P( sin(mid) , cos(mid) ) );
			double s1 = fabs( G.convex_cut( l ).get_area() );
			double s2 = s - s1;
			
			if( s1-s2 > 0 ){
				low = mid;
				flag1 = true;
			}else{
				high = mid;
				flag2 = true;
			}
		}
		while( low > high ) high += 2*PI ;
		
		for(int i=0 ; i < 100 ; i++ ){
			mid = (low + high) / 2.0;
			Line l( P(0,0) , P( sin(mid) , cos(mid) ) );
			double s1 = fabs( G.convex_cut( l ).get_area() );
			double s2 = s - s1;
			
			if( s1-s2 > 0 ){
				low = mid;
			}else{
				high = mid;
			}
		}
		{
			double x = sin(mid);
			double y = cos(mid);
			Line l( P(0,0) , P( x , y ) );
			Polygon G_ = G.convex_cut( l );
			//G_.print();
			double s1 = fabs( G_.get_area() );
			double s2 = s - s1;
			//printf("// %.6f %.6f %.6f \n", s, s1, s2 );
			printf("%.15f %.15f\n", x , y );
		}
	}
}

Measured memory_bytes: 1240