#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 5;
int n;
int ops[maxn][3];
int G[maxn][maxn];
int visited[maxn];
int up[maxn], down[maxn];
int Left[maxn], Right[maxn];
int connect(int i,int j){
return pow(ops[i][2]+ops[j][2],2) >= pow(ops[i][0]-ops[j][0],2) + pow(ops[i][1]-ops[j][1],2);
}
void calCross(int i,int x,int& y0,int& y1){
double dy = sqrt(pow(ops[i][2],2) - pow(ops[i][0]-x,2));
int y = ops[i][1];
if(y+dy >= 1000) y1 = y-dy;
if(y-dy <= 0) y0 = y+dy;
}
int DFS(int i){
if(down[i]) return 1;
visited[i] = 1;
int mark = 0;
for(int j = 0;j < n;j++){
if(G[i][j] && !visited[j]){ // j !!!
mark = DFS(j);
if(mark) break;
}
}
return mark;
}
int main()
{
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
while(scanf("%d",&n) != EOF){
memset(visited,0,sizeof(visited));
memset(G,0,sizeof(G));
memset(up,0,sizeof(up));
memset(down,0,sizeof(down));
memset(Left,0,sizeof(Left));
memset(Right,0,sizeof(Right));
for(int i = 0;i < n;i++){
scanf("%d%d%d",&ops[i][0],&ops[i][1],&ops[i][2]);
}
for(int i = 0;i < n;i++){
int x = ops[i][0];
int y = ops[i][1];
int r = ops[i][2];
if(x - r <= 0) Left[i] = 1;
if(x + r >= 1000) Right[i] = 1;
if(y + r >= 1000) up[i] = 1;
if(y - r <= 0) down[i] = 1;
for(int j = i+1;j < n;j++){
if(connect(i,j)) G[i][j] = G[j][i] = 1;
}
}
int mark = 0;
for(int i = 0;i < n;i++){
if(up[i] && !visited[i]){
mark = DFS(i);
if(mark) break;
}
}
if(!mark){
double y0 = 0,y1 = 1000,y2 = 0,y3 = 1000;
for(int i = 0;i < n;i++){
if(Left[i]) calCross(i,0,y0,y1);
if(Right[i]) calCross(i,1000,y2,y3);
}
printf("0.00 %.2f 1000.00 %.2f\n",y0,y1);
}
else puts("IMPOSSIBLE");
}
return 0;
}