import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.StringTokenizer;

public class cake_sm {
	class Point {
		double x, y;

		public Point(double x, double y) {
			super();
			this.x = x;
			this.y = y;
		}

		@Override
		public String toString() {
			return "(" + x + ", " + y + ")";
		}

		double dist(Point p) {
			return Math.sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
		}
	}

	double EPS = 1e-12;

	void solve() {
		int n = nextInt();
		assert 1 <= n && n <= 15;
		int m = nextInt();
		assert 3 <= m && m <= 100;
		Point[] ps = new Point[m];
		for (int i = 0; i < ps.length; i++) {
			int x = nextInt();
			assert Math.abs(x) <= 1000;
			int y = nextInt();
			assert Math.abs(y) <= 1000;
			ps[i] = new Point(x, y);
		}
		assert area(ps) >= 0;
		System.err.println(area(ps));
		double S = area(ps) / n;
		// ps[0] ps[i] ps[i+1]...p ps[j];
		Point c = ps[0];
		Point last = ps[1];
		int start = 2;
		for (int it = 0; it < n; it++) {
			ArrayList<Point> cur = new ArrayList<Point>();
			cur.add(c);
			cur.add(last);
			cur.add(ps[start]);
			while (area(cur) < S) {
				start++;
				if (start >= ps.length)
					break;
				cur.add(ps[start]);
			}
			Point lo = cur.get(cur.size() - 2);
			Point hi = cur.get(cur.size() - 1);
			cur.remove(cur.size() - 1);
			for (int i = 0; i < 200; i++) {
				Point mp = new Point((lo.x + hi.x) / 2, (lo.y + hi.y) / 2);
				cur.add(mp);
				if (area(cur) <= S) {
					lo = mp;
				} else {
					hi = mp;
				}
				cur.remove(cur.size() - 1);
			}
			cur.add(lo);
			out.println(cur.size());
			for (Point p : cur) {
				out.printf("%.9f %.9f\n", p.x, p.y);
			}
			last = lo;
			
			if (start < ps.length && lo.dist(ps[start]) < EPS) {
				start++;
			}
		}
	}

	double area(List<Point> ps) {
		return area(ps.toArray(new Point[ps.size()]));
	}

	double area(Point... ps) {
		if (ps.length < 3) {
			throw new AssertionError();
		}
		double area = 0;
		for (int i = 1; i < ps.length - 1; i++) {
			// 0..i..i+1
			area += (ps[i].x - ps[0].x) * (ps[i + 1].y - ps[0].y) - (ps[i + 1].x - ps[0].x) * (ps[i].y - ps[0].y);
		}
		return area / 2;
	}

	BufferedReader br;
	StringTokenizer st;
	PrintWriter out;

	public void run() {
		try {
			String filename = "cake";
			br = new BufferedReader(new FileReader(filename + ".in"));
			out = new PrintWriter(filename + ".out");
			solve();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
			System.exit(1);
		}
	}

	String nextToken() {
		try {
			while (st == null || !st.hasMoreTokens()) {
				String s = br.readLine();
				if (s == null) {
					return null;
				}
				st = new StringTokenizer(s);
			}
			return st.nextToken();
		} catch (IOException e) {
			throw new RuntimeException();
		}
	}

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

	long nextLong() {
		return Integer.parseInt(nextToken());
	}

	public static void main(String[] args) {
		Locale.setDefault(Locale.US);
		new cake_sm().run();
	}
}
