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

// Неверное решение --- смотрит все диагонали и достраивает их до квадрата.
// В частности (0, 0) и (0, 1) не обработает, так как координаты квадрата дожны быть целые

import java.io.*;
import java.math.*;
import java.util.*;
import java.awt.Point;

public class collider2_vu_wrong implements Runnable {

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

	BufferedReader br;

	StringTokenizer st;

	PrintWriter out;

	String FNAME = "collider2_vu_wrong".substring(0, "collider2_vu_wrong"
			.indexOf('_'));

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

	String nextToken() {
		while (st == null || !st.hasMoreTokens()) {
			try {
				st = new StringTokenizer(br.readLine());
			} catch (Exception e) {
				return "0";
			}
		}
		return st.nextToken();
	}

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

	double nextDouble() {
		return Double.parseDouble(nextToken());
	}

	long nextLong() {
		return Long.parseLong(nextToken());
	}

	BigInteger nextBigInteger() {
		return new BigInteger(nextToken());
	}

	void MyAssert(boolean u, String message) {
		if (!u) {
			throw new Error("Assertion failed!!! " + message);
		}
	}

	void inBounds(long x, long l, long r, String name) {
		MyAssert(l <= x && x <= r, name + " is not in bounds!!! " + x
				+ " is not in [" + l + ", " + r + "]");
	}

	void Assertions() {
		inBounds(n, 1, 2000, "n");
		for (int i = 0; i < n; i++) {
			inBounds(pt[i].x, -100000000, 100000000, "Point[" + i + "].x");
			inBounds(pt[i].y, -100000000, 100000000, "Point[" + i + "].y");
			for (int j = 0; j < i; j++) {
				MyAssert(!pt[i].equals(pt[j]), "Point[" + i + "] = Point[" + j
						+ "]");
			}
		}
	}

	int n;
	Point[] pt;

	private void solve() throws IOException {
		n = nextInt();
		pt = new Point[n];
		for (int i = 0; i < n; i++) {
			pt[i] = new Point(nextInt(), nextInt());
		}
		Assertions();

		HashSet<Point> h = new HashSet<Point>();
		for (Point p : pt) {
			h.add(p);
		}

		ArrayList<Point> ans = new ArrayList<Point>();
		ans.add(new Point(pt[0].x + 239, pt[0].y));
		ans.add(new Point(pt[0].x + 239, pt[0].y + 239));
		ans.add(new Point(pt[0].x, pt[0].y + 239));

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < i; j++) {
				int cur = 2;
				double xc = (pt[i].x + pt[j].x) / 2.0;
				double yc = (pt[i].y + pt[j].y) / 2.0;
				Point f = new Point((int) (xc + yc - pt[j].y), (int) (yc
						+ pt[j].x - xc));
				Point g = new Point((int) (xc - yc + pt[j].y), (int) (yc
						- pt[j].x + xc));
				if (h.contains(f)) {
					cur--;
				}
				if (h.contains(g)) {
					cur--;
				}
				if (cur < ans.size()) {
					ans = new ArrayList<Point>();
					if (!h.contains(g)) {
						ans.add(g);
					}
					if (!h.contains(f)) {
						ans.add(f);
					}
				}
			}
		}

		out.println(ans.size());
		for (Point p : ans) {
			out.println(p.x + " " + p.y);
		}
	}
}
