#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<math.h> using namespace std;
typedef long long ll;
double sqr(double x) { return x*x; }
struct Point{ double x,y; Point(){} Point (double _x,double _y) { x = _x; y = _y; } void read() { scanf("%lf%lf",&x,&y); } double distance(Point a) { return hypot(x-a.x,y-a.y); }
};
struct Circle{ Point p; double r; Circle(){} Circle(double _x,double _y,double _r) { p = Point(_x,_y); r = _r; } void read() { p.read(); scanf("%lf",&r); } bool cross(Circle a) { double dis = p.distance(a.p); return dis<=r+a.r; }
}c[1200];
int n; int vis[1200]; double a1,a2;
bool dfs(int k) { //printf("now dfs(%d)\n",k); //cross left if (c[k].p.x<=c[k].r) { double t = sqrt(sqr(c[k].r)-sqr(c[k].p.x)); a1 = min(a1,c[k].p.y-t); } //cross right if (1000-c[k].p.x<=c[k].r) { double t = sqrt(sqr(c[k].r)-sqr(1000-c[k].p.x)); a2 = min(a2,c[k].p.y-t); } //cross bottom if (c[k].p.y<=c[k].r) return false; bool res = true; for (int i = 1 ; i <= n ; i ++) { if (!vis[i]&&c[k].cross(c[i])) { vis[i] = 1; if (!dfs(i)) { res = false; break; } } } return res; }
int main() { while (~scanf("%d",&n)) { memset(vis,0,sizeof(vis)); a1 = a2 = 1000.0;
for (int i = 1 ; i <= n ; i ++) { c[i].read(); } int f = 1; for (int i = 1 ; i <= n ; i ++) { if (!vis[i]&&c[i].p.y+c[i].r>=1000.0) { vis[i] = 1; if (!dfs(i)) {
printf("IMPOSSIBLE\n"); f = 0; break; } } } if (f) printf("%.2f %.2f %.2f %.2f\n",0.0,a1,1000.0,a2);