#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <map> 
#include <string>
#include <vector>  
#include <iostream> 
#include <sstream> 
#include <queue>
#include <algorithm>
#include <set>

using namespace std;
 
#define ll long long
#define PB 		push_back
#define FOR(a,start,end) 	for(int a=int(start); a<int(end); a++)
#define INF 		INT_MAX
#define SORT(a) 	sort(a.begin(),a.end()) 
#define CL(a,x) 		memset(a,x,sizeof(a))
#define REP(a,x)	for(int a=0;a<x;a++)
#define REP1(a,x)	for(int a=1;a<=x;a++)
#define MP 		make_pair

 
 
typedef vector<int>     vi;
typedef pair<int,int>     pii; 
typedef vector<string> vs;
typedef vector<pii> vii;
typedef vector<vector<int> > vvi;
typedef vector<vector<string> > vvs;
typedef vector<pair<string,string> > vss;
typedef pair<string,string> pss; 
typedef pair<int,pii> ppii;
typedef vector<ppii> vppii;
typedef vector<vector<pii> > vvii;
typedef vector<vvi> vvvi;


ppii px;
vppii vc;
int i0,i,j,k,n,k1,k2,m;
int z,c,d,t;
int a,b,a1,a2,b1,b2; 


vi vk,vz,vig; 
vii vx,vy;
vvi vvk,vvf,vvk0;	
pii p1,p2,p0; 
int ta[100010];
set<int> sk,syk;
set<pii> sy;
vector<set<int> > vyk;
vector<set<pii> > vya;
vppii vxx;
set<int>::iterator it;
vector<pair<pii,pii> > vw;
/*
int czykol(int a, int b){	//a - wcześniejszy

	if(vy[a].first<=vy[b].first){
		if(vy[b].first<vy[a].second){
			return 1
		}
		else 
			return 0;
	}
	else {
		if(vy[a].first<vy[a].second){
			return 1;
		}
		else 
			return 0;
	}
}
*/
void spr(int i0,int i1,int i2){
	int i,a;
	pii p0;
	set<pii>::iterator itlow,itup,itx,itmid;

	itlow=vya[vig[i1]].lower_bound(MP(0,0));
	itmid=vya[vig[i1]].lower_bound(MP(vy[i0].first,0));
	itup=vya[vig[i1]].upper_bound(MP(vy[i0].second,0));
	if(itlow!=itup){		//moze coś być
		for(itx=itlow;itx!=itmid;itx++){
			p0=*itx;
			if(p0.second!=i0){
				if(vy[p0.second].second>vy[i0].first){
					if(vyk[vig[i2]].find(p0.second)==vyk[vig[i2]].end()){		//jest nakładka

						if(i2>vx[p0.second].first){
							//spr(i0,i1,min(vx[i0].first,vxx[vig[vx[p0.second].first-1]].first));
							spr(i0,i1,min(vx[p0.second].first,vx[i0].first));
						}
						else {
							vz[max(i0,p0.second)]=0;	
							vy[min(i0,p0.second)].first=min(vy[i0].first,vy[p0.second].first);
							vy[min(i0,p0.second)].second=max(vy[i0].second,vy[p0.second].second);
							vx[min(i0,p0.second)].first=min(vx[i0].first,vx[p0.second].first);
							vx[min(i0,p0.second)].second=max(vx[i0].second,vx[p0.second].second);

							vx[max(i0,p0.second)]=vx[min(i0,p0.second)];
							vy[max(i0,p0.second)]=vy[min(i0,p0.second)];
						}
					

					}
				}
			}
		}

		for(;itx!=itup;itx++){
			p0=*itx;
			if(p0.second!=i0){
				if((p0.first<vy[i0].second)&&(p0.first>vy[i0].first)){
					if(vyk[vig[i2]].find(p0.second)==vyk[vig[i2]].end()){		//jest nakładka
						if(i2>vx[p0.second].first){
							//spr(i0,i1,min(vx[i0].first,vxx[vig[vx[p0.second].first-1]].first));
							spr(i0,i1,min(vx[p0.second].first,vx[i0].first));
						}
						else {
							vz[max(i0,p0.second)]=0;	
							vy[min(i0,p0.second)].first=min(vy[i0].first,vy[p0.second].first);
							vy[min(i0,p0.second)].second=max(vy[i0].second,vy[p0.second].second);
							vx[min(i0,p0.second)].first=min(vx[i0].first,vx[p0.second].first);
							vx[min(i0,p0.second)].second=max(vx[i0].second,vx[p0.second].second);

							vx[max(i0,p0.second)]=vx[min(i0,p0.second)];
							vy[max(i0,p0.second)]=vy[min(i0,p0.second)];
						}

					}
				}
			}
		}
	}
}


				


int main() {  
//	freopen( "c:\\wojtek\\uva\\pa\\debug\\t1.in", "rt", stdin);  
	//	int czas=clock();
	//pi=2*acos(0.0);
	  
	//scanf("%ld",&t);

	cin>>n;
	vx.clear();
	vy.clear();
	vz.assign(n,1);
	for(i=0;i<n;i++){
		cin>>a1>>a2>>b1>>b2;
		vx.push_back(MP(a1,a2));
		vy.push_back(MP(b1,b2));
	}
	vxx.clear();
	for(i=0;i<n;i++){
		vxx.push_back(MP(vx[i].first,MP(1,i)));
		vxx.push_back(MP(vx[i].second,MP(0,i)));
	}
	SORT(vxx);

	i=0;
	vig.assign(1000010,0);
	sy.clear();
	syk.clear();
	//vya.assign(1000001,sy);
	while(i<vxx.size()){
		if(vxx[i].second.first==1){
			sy.insert(MP(vy[vxx[i].second.second].first,vxx[i].second.second));
			sy.insert(MP(vy[vxx[i].second.second].second,vxx[i].second.second));

		}
		else {
			//sy.erase(vxx[i].second.second);
			syk.insert(vxx[i].second.second);
		}
		i++;
		while(i<vxx.size()&&vxx[i].first==vxx[i-1].first){
			if(vxx[i].second.first==1){
				sy.insert(MP(vy[vxx[i].second.second].first,vxx[i].second.second));
				sy.insert(MP(vy[vxx[i].second.second].second,vxx[i].second.second));
			}
			else {
				//sy.erase(vxx[i].second.second);
				syk.insert(vxx[i].second.second);
			}
			i++;
		}
		vig[vxx[i-1].first]=vya.size();
		vya.push_back(sy);
		vyk.push_back(syk);
		
	}

	i=1;
	//sk.clear();
	while(i<vxx.size()){
		if(vxx[i].second.first==1){
			//spr(vxx[i].second.second,vxx[vig[vxx[i].first]-1].first,vxx[vig[vxx[i].first]-1].first);	
			spr(vxx[i].second.second,vxx[i].first,vxx[i].first);	
		}
		i++;
	}

	z=0;
	vw.clear();
	for(i=0;i<n;i++){
		if(vz[i]==1){
			z++;
			vw.push_back(MP(vx[i],vy[i]));
		}
	}
	SORT(vw);

	cout<<z<<endl;
	for(i=0;i<vw.size();i++){
		
		cout<<vw[i].first.first<<" "<<vw[i].first.second<<" "<<vw[i].second.first<<" "<<vw[i].second.second<<endl;
		
	}

	//czas = clock() - czas;
	//printf("%lf\n",double(czas)/CLOCKS_PER_SEC);					

			
	return 0;
	 
} 
