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

public class TestsGen implements Runnable {
	public static void main(String[] args) {
		if (args.length < 1) {
			for (I = 1; (new File(getName(I) + ".t")).exists(); I++)
				;
		} else {
			I = Integer.parseInt(args[0]);
		}
		new Thread(new TestsGen()).start();
	}

	PrintWriter out;

	Random rand = new Random(6439586L);

	static int I;

	static String getName(int i) {
		return ((i < 10) ? "0" : "") + i;
	}

	void open() {
		try {
			System.out.println("Generating test " + I);
			out = new PrintWriter(getName(I));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			System.exit(-1);
		}
	}

	void close() {
		out.close();
		I++;
	}
	
	final String ALPHA = "abcdefghijklmnopqrstuvwxyz";

	String randString(int len, String alpha) {
		StringBuilder ans = new StringBuilder();
		int k = alpha.length();
		for (int i = 0; i < len; i++) {
			ans.append(alpha.charAt(rand.nextInt(k)));
		}
		return ans.toString();
	}


	long rand(long l, long r) {
		return l + (rand.nextLong() >>> 1) % (r - l + 1);
	}

	int rand(int l, int r) {
		return l + rand.nextInt(r - l + 1);
	}
	
	class Point implements Comparable<Point> {
		long x, y;
		
		public Point(int x, int y) {
			this.x = x;
			this.y = y;
		}
		
		@Override
		public boolean equals(Object o) { 
			if (!(o instanceof Point)) return false;
			Point p = (Point)o;
			return x == p.x && y == p.y;
		}

		@Override
		public int compareTo(Point o) {
			return x < o.x ? -1 : x > o.x ? 1 : y < o.y ? -1 : y > o.y ? 1 : 0;
		}
	}
	
	Point randPoint(int MAXC) {
		return new Point(rand(-MAXC, MAXC), rand(-MAXC, MAXC));
	}
	
	boolean onLine(Point a, Point b, Point c) {
		long ux = b.x - a.x;
		long uy = b.y - a.y;
		long vx = c.x - a.x;
		long vy = c.y - a.y;
		return vx * uy - vy * ux == 0;
	}
	
	void genTest(int n, int MAXC) {
		ArrayList<Point> pl = new ArrayList<Point>();
		TreeSet<Point> tp = new TreeSet<Point>();
		myAssert(n >= 3);
		for (int i = 0; i < n; ++i) {
			while (true) {
				Point p = randPoint(MAXC);
				if (tp.contains(p)) continue;
				tp.add(p);
				pl.add(p);
				break;
			}
		}
		while (onLine(pl.get(0), pl.get(1), pl.get(2))) {
			tp.remove(pl.get(2));
			while (true) {
				Point p = randPoint(MAXC);
				if (tp.contains(p)) continue;
				tp.add(p);
				pl.set(2, p);
				break;
			}
		}
		open();
		out.println(n);
		for (Point p : pl) {
			out.println(p.x + " " + p.y);
		}
		close();
	}
	
	
	int MAXN = 100000;
	int MAXC = (int)(1e+9);
	
	public void solve() throws IOException {
		for (int i = 0; i < 10; ++i) {
			genTest(rand(3, 5), 10);
		}
		for (int i = 0; i < 20; ++i) {
			genTest(rand(MAXN / 2, MAXN), MAXC);
		}
		for (int i = 0; i < 3; ++i) {
			genTest(MAXN, MAXC);
		}
	}

	
	void myAssert(boolean e) {
		if (!e) {
			throw new Error("Assertion failed");
		}
	}

	public void run() {
		try {
			solve();
		} catch (Throwable e) {
			e.printStackTrace();
			System.exit(-1);
		}
	}
}