1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

const int MAXN = 100005;

struct poz
{
	int x;
	int y;
};

poz mkpoz(int x, int y)
{
	poz a;
	a.x=x;
	a.y=y;
	return a;
}

struct ple
{
	poz a;
	poz b;
	//a<b
	
	void scan()
	{
		scanf("%d%d%d%d", &a.x, &b.x, &a.y, &b.y);
		if (a.x>b.x) swap(a.x, b.x);
		if (a.y>b.y) swap(a.y, b.y);
	}
};

bool operator<(ple k, ple l)
{
	if (k.a.x!=l.a.x) return k.a.x<l.a.x;
	if (k.b.x!=l.b.x) return k.b.x<l.b.x;
	if (k.a.y!=l.a.y) return k.a.y<l.a.y;
	return k.b.y<l.b.y;
}

ple t[MAXN];
bool unu[MAXN];
vector<ple> vic;

bool in(poz k, ple l)
{
	if (l.a.x<k.x && k.x<l.b.x && l.a.y<k.y && k.y<l.b.y) return 1;
	return 0;
}

bool inter(int a, int b)
{
	ple k=t[a];
	ple l=t[b];
	
	if (in(k.a, l)) return 1;
	if (in(k.b, l)) return 1;
	if (in(mkpoz(k.a.x, k.b.y), l)) return 1;
	if (in(mkpoz(k.b.x, k.a.y), l)) return 1;
	
	if (in(l.a, k)) return 1;
	if (in(l.b, k)) return 1;
	if (in(mkpoz(l.a.x, l.b.y), k)) return 1;
	if (in(mkpoz(l.b.x, l.a.y), k)) return 1;
	
	if (k.a.x<=l.a.x && l.b.x<=k.b.x && l.a.y<=k.a.y && k.b.y<=l.b.y) return 1;
	if (l.a.x<=k.a.x && k.b.x<=l.b.x && k.a.y<=l.a.y && l.b.y<=k.b.y) return 1;
	
	return 0;
}

ple conn(ple k, ple l)
{
	ple w;
	w.a.x=min(k.a.x, l.a.x);
	w.a.y=min(k.a.y, l.a.y);
	w.b.x=max(k.b.x, l.b.x);
	w.b.y=max(k.b.y, l.b.y);
	
	return w;
}

void add(int id)
{
	for (int i=0; i<id; i++)
	{
		if (unu[i] || !inter(id, i)) {continue;}
		//printf("   %d %d\n", i, id);
		t[id]=conn(t[i], t[id]);
		unu[i]=1;
		add(id);
		return;
	}
	
}

int main()
{
	int n;
	scanf("%d", &n);
	for (int i=0; i<n; i++)
	{
		t[i].scan();
		add(i);
	}
	
	for (int i=0; i<n; i++)
		if (!unu[i]) vic.push_back(t[i]);
	
	sort(vic.begin(), vic.end());
	
	printf("%lu\n", vic.size());
	
	for (int i=0; i<vic.size(); i++) 
		printf("%d %d %d %d\n", vic[i].a.x, vic[i].b.x, vic[i].a.y, vic[i].b.y);
	
	return 0;
}