// Задача "Гигантский квадратный коллайдер"
// 4-ая личная Интернет-олимпиада сезона 2007-2008
// Автор задачи: Владимир Ульянцев, ulyantsev@rain.ifmo.ru
// Автор решения: Сергей Поромов, poromov@rain.ifmo.ru

import java.io.*;
import java.util.*;

public class collider2_sp implements Runnable {

	public static void main(String[] args) {
		new Thread(new collider2_sp()).run();
	}

	public void run() {
		try {
			Locale.setDefault(Locale.US);
			br = new BufferedReader(new FileReader(FILENAME + ".in"));
			out = new PrintWriter(FILENAME + ".out");
			solve();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	BufferedReader br;

	PrintWriter out;

	StringTokenizer st;

	String nextToken() throws IOException {
		while (st == null || !st.hasMoreTokens()) {
			st = new StringTokenizer(br.readLine());
		}
		return st.nextToken();
	}

	int nextInt() throws IOException {
		return Integer.parseInt(nextToken());
	}

	void myAssert(boolean e, String s) {
		if (!e) {
			throw new Error("Assertion failure " + s);
		}
	}

	private static final String FILENAME = "collider2";
	
	class Point {
		int x, y;
		
		Point(int x, int y) {
			this.x = x;
			this.y = y;
		}
		
		@Override
		public int hashCode() {
			return (int)1e8 * x + y;
		}
		
		@Override
		public boolean equals(Object o) {
			Point p = (Point)o;
			return (x == p.x) && (y == p.y);
		}
		
		@Override
		public String toString() {
			return x + " " + y;
		}
	}
	
	final int MAXCOORD = (int) 1e8;
	final int MAXN = 2000;

	public void solve() throws IOException {
		int n = nextInt();
		myAssert(1 <= n && n <= MAXN, "Wrong n");
		Point[] p = new Point[n];
		HashSet<Point> hs = new HashSet<Point>();
		for (int i = 0; i < n; i++) {
			int x = nextInt();
			int y = nextInt();
			myAssert(-MAXCOORD <= x && x <= MAXCOORD, "Wrong x");
			myAssert(-MAXCOORD <= y && y <= MAXCOORD, "Wrong y");
			p[i] = new Point(x, y);
			myAssert(!hs.contains(p[i]), "Equal points");
			hs.add(p[i]);
		}
		ArrayList<Point> ans = new ArrayList<Point>();
		ans.add(new Point(p[0].x + 1, p[0].y));
		ans.add(new Point(p[0].x + 1, p[0].y + 1));
		ans.add(new Point(p[0].x, p[0].y + 1));
		for (int i = 0; i < n; i++) {
			for (int j = i + 1; j < n; j++) {
				int dx = p[i].x - p[j].x;
				int dy = p[i].y - p[j].y;
				Point p1 = new Point(p[i].x - dy, p[i].y + dx);
				Point p2 = new Point(p[j].x - dy, p[j].y + dx);
				int b1 = hs.contains(p1) ? 0 : 1;
				int b2 = hs.contains(p2) ? 0 : 1;
				if (b1 + b2 < ans.size()) {
					ans.clear();
					if (b1 == 1) {
						ans.add(p1);
					} 
					if (b2 == 1) {
						ans.add(p2);
					}
				}

				p1 = new Point(p[i].x + dy, p[i].y - dx);
				p2 = new Point(p[j].x + dy, p[j].y - dx);
				b1 = hs.contains(p1) ? 0 : 1;
				b2 = hs.contains(p2) ? 0 : 1;
				if (ans == null || b1 + b2 < ans.size()) {
					ans.clear();
					if (b1 == 1) {
						ans.add(p1);
					} 
					if (b2 == 1) {
						ans.add(p2);
					}
				}			
			}
		}
		out.println(ans.size());
		for (Point po : ans) {
			out.println(po);
		}
	}
}
