Problem: We understand that reading English is a great pain to many of you. So we’ll keep this problem statememt simple. Write a program that reports the point equally distant from a set of lines given as the input. In case of no solutions or multiple solutions, your program should report as such.



Input

The input consists of multiple datasets. Each dataset is given in the following format:

n
x1,1 y1,1 x1,2 y1,2
x2,1 y2,1 x2,2 y2,2
...
xn,1 yn,1 xn,2 yn,2


n is the number of lines (1 ≤ n ≤ 100); (xi,1, yi,1) and (xi,2, yi,2) denote the different points the i-th line passes through. The lines do not coincide each other. The coordinates are all integers between -10000 and 10000.

The last dataset is followed by a line containing one zero. This line is not a part of any dataset and should not be processed.

Output

For each dataset, print a line as follows. If there is exactly one point equally distant from all the given lines, print the x- and y-coordinates in this order with a single space between them. If there is more than one such point, just print "Many" (without quotes). If there is none, just print "None" (without quotes).

The coordinates may be printed with any number of digits after the decimal point, but should be accurate to 10-4.

Example

Input

2
-35 -35 100 100
-49 49 2000 -2000
4
0 0 0 3
0 0 3 0
0 3 3 3
3 0 3 3
4
0 3 -4 6
3 0 6 -4
2 3 6 6
-1 2 -4 6
0


Output

Many
1.5000 1.5000
1.000 1.000

Solution (in CPP):

Solution:
#include <bits/stdc++.h>

using namespace std;

const double eps = 1e-10;

struct point {
	double x, y;
	void scan() {
		scanf("%lf%lf", &x, &y);
	}
	point() {
	}
	point(const double & a, const double & b) : x(a), y(b) {
	}
	double sqrlen() const {
		return x * x + y * y;
	}
	double len() const {
		return sqrt(max(0., sqrlen()));
	}
	point zoom(const double & l) const {
		double lambda(l / len());
		return point(lambda * x, lambda * y);
	}
	point rev() const {
		return point(-y, x);
	}
	void print() const {
		printf("%.10f %.10f\n", x, y);
	}
};
double sqr(double x) { return x * x; }
point operator + (const point& p1, const point& p2) { return point(p1.x + p2.x, p1.y + p2.y); }
point operator - (const point& p1, const point& p2) { return point(p1.x - p2.x, p1.y - p2.y); }
point operator * (const point& p1, double d) { return point(p1.x * d, p1.y * d); }
point operator / (const point& p1, double d) { return point(p1.x / d, p1.y / d); }
int dcmp(double x) { return fabs(x) <= eps ? 0 : (x > 0 ? 1 : -1); }
double det(point p1, point p2) { return p1.x * p2.y - p1.y * p2.x; }
double dist(point p1, point p2) { return sqrt(sqr(p1.x - p2.x) + sqr(p1.y - p2.y)); }
point nor(point p) { return p / sqrt(max(0., sqr(p.x) + sqr(p.y))); }

struct Line {
	point s, d;
	Line(const point & a, const point & b) : s(a), d(b) {
	}
	Line() {
	}
} l[10001], p[10001][2];

int n;
point a[10001], b[10001];

point inter(point p, point v, point q, point w) {
	point u = p - q;
	double t = det(w, u) / det(v, w);
	return p + v * t;
}

double D(point p, point p1, point p2) {
	return fabs(det(p - p1, p - p2)) / dist(p1, p2);
}
bool operator < (const point& p1, const point& p2) {
	if (dcmp(p1.x - p2.x)) return p1.x < p2.x;
	if (dcmp(p1.y - p2.y)) return p1.y < p2.y;
	return false;
}
__inline double operator * (const point & a, const point & b) {
	return a.x * b.y - a.y * b.x;
}
__inline point intersection(const Line & a, const Line & b) {
	double lambda((b.s - a.s) * b.d / (a.d * b.d));
	return a.s + a.d * lambda;
}
__inline bool equal(const double & a, const double & b) {
	return dcmp(a - b) == 0;
}

__inline double dis(const point & a, const point & s, const point & t) {
	Line lp(a, (t - s).rev());
	point p(intersection(lp, Line(s, t - s)));
	return (a - p).len();
}
int main( ) {
	while (1) {
		scanf("%d", &n);
		if (n == 0) break;
		for (int i = 1; i <= n; i ++) {
			scanf("%lf %lf", &a[i].x, &a[i].y);
			scanf("%lf %lf", &b[i].x, &b[i].y);
		}
		if (n <= 2) { printf("Many\n"); continue; }
		for(int i(1); i <= 3; i++) {
			l[i] = Line(a[i], b[i] - a[i]);
		}
		for (int i = 1; i <= 2; i ++) {
			if (dcmp(l[i].d * l[i + 1].d) == 0) 
				p[i][0] = p[i][1] = Line((l[i].s + l[i + 1].s) * 0.5, l[i].d);
			else {
				p[i][0] = Line(intersection(l[i], l[i + 1]), (l[i].d.zoom(1) + l[i + 1].d.zoom(1)) * 0.5);
				p[i][1] = Line(intersection(l[i], l[i + 1]), (l[i].d.zoom(-1) + l[i + 1].d.zoom(1)) * 0.5);
			}
		}
		set<point> S;
		for (int i = 0; i < 2; i ++)
			for (int j = 0; j < 2; j ++) {
				point x = p[1][i].d;
				point y = p[2][j].d;

				if (dcmp(det(x, y)) == 0) continue;
				point o = intersection(p[1][i], p[2][j]);
				bool flag = false;
				for (int j = 2; j <= n; ++ j)
					if (dcmp(dis(o, a[j], b[j]) - dis(o, a[1], b[1]))) {
						flag = true;
						break;
					}
				if (flag == false) S.insert(o);
			}
		if (S.size() == 0) printf("None\n");
		else if (S.size() > 1) printf("Many\n");
		else S.begin() -> print();
	}
	return 0;
}