//UVA11134FabledRooks
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 5000 + 10;
int xl[MAXN], yl[MAXN], xr[MAXN], yr[MAXN], x[MAXN], y[MAXN];
int n;
bool solve(int* a, int* b, int* c) {
fill(c, c + n, -1);
for(int col = 1; col <= n; col++) {//先确定充填的行(列)
int rook = -1;
int minb = n + 1;
for(int i = 0; i < n; i++) {
if(a[i] <= col && c[i] < 0 && b[i] < minb) {//贪心
rook = i; minb = b[i];
}
}
if(b[rook] < col) return false;
c[rook] = col;
}
return true;
}
int main() {
while(scanf("%d", &n) == 1 && n) {
for(int i = 0; i < n; i++) scanf("%d%d%d%d", &xl[i], &yl[i], &xr[i], &yr[i]);
if(solve(xl, xr, x) && solve(yl, yr, y)) {
for(int i = 0; i < n; i++) printf("%d %d\n", x[i], y[i]);
}
else printf("IMPOSSIBLE\n");
}
return 0;
}
/*
8
1 1 2 2
5 7 8 8
2 2 5 5
2 2 5 5
6 3 8 6
6 3 8 5
6 3 8 8
3 6 7 8
8
1 1 2 2
5 7 8 8
2 2 5 5
2 2 5 5
6 3 8 6
6 3 8 5
6 3 8 8
3 6 7 8
0
*/