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, comment;

    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));
            comment.print("Generating test " + I + ": ");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }

    void close() {
        out.close();
        I++;
    }

    final String ALPHA = "abcdefghijklmnopqrstuvwxyz";
    final String ALPHA_EXT = ALPHA + ALPHA.toUpperCase();

    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);
    }

    final int MAXN = 100;

    final double eps = 1e-8;
    
    class Pair implements Comparable<Pair> {
	int x, y;
	double ang;
	
	public Pair(int x, int y) {
	    this.x = x;
	    this.y = y;
	    ang = Math.atan2(y, x);
	}

	@Override
	public int compareTo(Pair o) {
	    return ang < o.ang - eps ? -1 : ang > o.ang + eps ? 1 : 0;
	}
	
	@Override
	public boolean equals(Object o) {
	    if (!(o instanceof Pair)) return false;
	    Pair p = (Pair)o;
	    return x * p.y - y * p.x == 0 && x * p.x + y * p.y > 0;
	}
    }
    
    void saveTest(TreeSet<Pair> ts) {
	int sx = rand(-300, 300);
	int sy = rand(-300, 300);
	
	ArrayList<Pair> al = new ArrayList<Pair>();
	for (Pair p : ts) {
	    al.add(new Pair(sx, sy));
	    sx += p.x;
	    sy += p.y;
	}
	
	if (rand.nextBoolean()) {
	    Collections.reverse(al);
	}
	int n = al.size();
	open();
	out.println(n);
	int st = rand(0, al.size() - 1);
	for (int i = 0; i < n; ++i) {
	    out.println(al.get((i + st) % n).x + " " + al.get((i + st) % n).y);
	}
	close();
    }
    
    void genRandomTest(int n) {
	TreeSet<Pair> ts = new TreeSet<Pair>();
	while (ts.size() < n - 1) {
	    ts.add(new Pair(rand(-100, 100), rand(-100, 100)));
	}
	saveTest(ts);
    }
    
    void genSymmetric(int n) {
	TreeSet<Pair> ts = new TreeSet<Pair>();
	int lx = rand(0, 70);
	int rx = rand(lx + 30, 100);
	int ly = rand(0, 70);
	int ry = rand(ly + 30, 100);
	while (ts.size() < n - 1) {
	    int tx = rand(lx, rx);
	    int ty = rand(ly, ry);
	    ts.add(new Pair(tx, ty));
	    ts.add(new Pair(-tx, -ty));
	    ts.add(new Pair(-tx, ty));
	    ts.add(new Pair(tx, -ty));
	}
	saveTest(ts);
    }

    private void genBig(int n) {
	TreeSet<Pair> ts = new TreeSet<Pair>();
	ts.add(new Pair(3000, 0));
	ts.add(new Pair(-3000, 0));
	ts.add(new Pair(0, 3000));
	ts.add(new Pair(0, -3000));
	while (ts.size() < n - 1) {
	    ts.add(new Pair(rand(-100, 100), rand(-100, 100)));
	}
	saveTest(ts);
    }
    
    
    public void solve() throws IOException {
        for (int i = 0; i < 40; ++i) {
            genSymmetric(rand(4, 100));
        }
        genSymmetric(100);
    }

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

    public void run() {
        try {
            comment = new PrintWriter("comments.txt");
            solve();
        } catch (Throwable e) {
            e.printStackTrace();
            System.exit(-1);
        } finally {
            comment.close();
        }
    }
}