#include <bits/stdc++.h>
#define FOR(i, a, b) for (int i = a; i <= b; ++i)
#define FORD(i, a, b) for (int i = a; i >= b; --i)
#define ll long long
using namespace std;
int d, k, cur;
vector<pair<int, int>> Edges;
void nhap() {
cin >> d >> k;
}
int Find(int k) {
int l = 1, r = k, res = 0;
while (l <= r) {
int m = (l + r) >> 1;
if (1ll * m * (m + 1) <= 2 * k) res = m, l = m + 1;
else r = m - 1;
}
return res;
}
// d = 2
void sub1() {
while (k) {
int T = Find(k);
int node = ++cur;
FOR(i, 1, T + 1) {
++cur;
Edges.push_back({node, cur});
}
k -= 1ll * T * (T + 1) / 2;
}
}
// d >= 3
void sub2() {
while (k) {
int st = ++cur;
int last = st;
FOR(i, 3, d) {
Edges.push_back({last, ++cur});
last = cur;
}
int ed = cur;
int T = sqrt(k);
FOR(i, 1, T) {
int a = ++cur, b = ++cur;
Edges.push_back({st, a});
Edges.push_back({ed, b});
}
k -= T * T;
}
}
void giai() {
if (d == 2) sub1();
else sub2();
cout << cur << ' ' << Edges.size() << '\n';
for (auto [u, v] : Edges)
cout << u << ' ' << v << '\n';
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
#define name "graph"
if (fopen(name".inp", "r")) {
freopen(name".inp", "r", stdin);
freopen(name".out", "w", stdout);
}
nhap();
giai();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgRk9SKGksIGEsIGIpIGZvciAoaW50IGkgPSBhOyBpIDw9IGI7ICsraSkKI2RlZmluZSBGT1JEKGksIGEsIGIpIGZvciAoaW50IGkgPSBhOyBpID49IGI7IC0taSkKI2RlZmluZSBsbCBsb25nIGxvbmcKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgZCwgaywgY3VyOwp2ZWN0b3I8cGFpcjxpbnQsIGludD4+IEVkZ2VzOwoKdm9pZCBuaGFwKCkgewogICAgY2luID4+IGQgPj4gazsKfQoKaW50IEZpbmQoaW50IGspIHsKICAgIGludCBsID0gMSwgciA9IGssIHJlcyA9IDA7CiAgICB3aGlsZSAobCA8PSByKSB7CiAgICAgICAgaW50IG0gPSAobCArIHIpID4+IDE7CiAgICAgICAgaWYgKDFsbCAqIG0gKiAobSArIDEpIDw9IDIgKiBrKSByZXMgPSBtLCBsID0gbSArIDE7CiAgICAgICAgZWxzZSByID0gbSAtIDE7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgovLyBkID0gMgp2b2lkIHN1YjEoKSB7CiAgICB3aGlsZSAoaykgewogICAgICAgIGludCBUID0gRmluZChrKTsKICAgICAgICBpbnQgbm9kZSA9ICsrY3VyOwogICAgICAgIEZPUihpLCAxLCBUICsgMSkgewogICAgICAgICAgICArK2N1cjsKICAgICAgICAgICAgRWRnZXMucHVzaF9iYWNrKHtub2RlLCBjdXJ9KTsKICAgICAgICB9CiAgICAgICAgayAtPSAxbGwgKiBUICogKFQgKyAxKSAvIDI7CiAgICB9Cn0KCi8vIGQgPj0gMwp2b2lkIHN1YjIoKSB7CiAgICB3aGlsZSAoaykgewogICAgICAgIGludCBzdCA9ICsrY3VyOwogICAgICAgIGludCBsYXN0ID0gc3Q7CiAgICAgICAgRk9SKGksIDMsIGQpIHsKICAgICAgICAgICAgRWRnZXMucHVzaF9iYWNrKHtsYXN0LCArK2N1cn0pOwogICAgICAgICAgICBsYXN0ID0gY3VyOwogICAgICAgIH0KICAgICAgICBpbnQgZWQgPSBjdXI7CiAgICAgICAgaW50IFQgPSBzcXJ0KGspOwogICAgICAgIEZPUihpLCAxLCBUKSB7CiAgICAgICAgICAgIGludCBhID0gKytjdXIsIGIgPSArK2N1cjsKICAgICAgICAgICAgRWRnZXMucHVzaF9iYWNrKHtzdCwgYX0pOwogICAgICAgICAgICBFZGdlcy5wdXNoX2JhY2soe2VkLCBifSk7CiAgICAgICAgfQogICAgICAgIGsgLT0gVCAqIFQ7CiAgICB9Cn0KCnZvaWQgZ2lhaSgpIHsKICAgIGlmIChkID09IDIpIHN1YjEoKTsKICAgIGVsc2Ugc3ViMigpOwoKICAgIGNvdXQgPDwgY3VyIDw8ICcgJyA8PCBFZGdlcy5zaXplKCkgPDwgJ1xuJzsKICAgIGZvciAoYXV0byBbdSwgdl0gOiBFZGdlcykKICAgICAgICBjb3V0IDw8IHUgPDwgJyAnIDw8IHYgPDwgJ1xuJzsKfQoKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CgogICAgI2RlZmluZSBuYW1lICJncmFwaCIKCiAgICBpZiAoZm9wZW4obmFtZSIuaW5wIiwgInIiKSkgewogICAgICAgIGZyZW9wZW4obmFtZSIuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihuYW1lIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CgogICAgbmhhcCgpOwogICAgZ2lhaSgpOwoKICAgIHJldHVybiAwOwp9Cg==