import std; void main () { int X, Y; readln.read(X, Y); int N = X * Y; auto edges = new Tuple!(int, int)[](0); foreach (i; 0 .. X) { edges ~= tuple(i, (i + 1) % X); } int pad = X; foreach (i; 0 .. X) { edges ~= tuple(i, pad); foreach (j; 0 .. Y - 2) { edges ~= tuple(pad + j, pad + j + 1); } pad += Y - 2 + 1; } foreach (ref e; edges) { e[0]++; e[1]++; } writeln(N, " ", N); foreach (e; edges) { writeln(e[0], " ", e[1]); } } void read (T...) (string S, ref T args) { import std.conv : to; import std.array : split; auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } }