#include <bits/stdc++.h>
#define int long long
#define endl "\n"
#define vec vector
#define pb push_back
#define INF INT_MAX
#define se second
#define fi first
#define pii pair<int, int>
#define pil pair<int, long long>
#define pli pair<long long, int>
#define pll pair<long long, long long>
#define str string
using ll = long long;
using ull = unsigned long long;
using ui = unsigned int;
const int MOD = 1000000007;
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
using namespace std;
void solve() {
int n;
ll k;
cin >> n >> k;
__int128 mx = (__int128)n * (n - 1) * (n - 2) / 6;
if (k > mx + 1) {
cout << "No\n";
return;
}
ll r = k;
vec<int> S;
for (int s = n - 1; s >= 2; --s) {
ll f = (ll)s * (s - 1) / 2;
if (f <= r) {
S.pb(s);
r -= f;
}
}
int l = S.size();
int L = l + 1;
vec<ll> leaves(L + 2, 0), suf(L + 3, 0);
if (l == 0) {
leaves[1] = n - 1;
} else {
int s1 = S[0];
leaves[1] = (n - 1) - s1;
for (int i = 2; i <= L; ++i) {
int si1 = S[i - 2];
suf[i] = si1 - (L - (i - 1));
}
suf[L + 1] = 0;
for (int i = 2; i <= L; ++i) {
leaves[i] = suf[i] - suf[i + 1];
}
}
cout << "Yes\n";
vec<pii> edges;
edges.reserve(n - 1);
for (int i = 2; i <= L; ++i)
edges.emplace_back(i - 1, i);
int cur = L + 1;
for (int i = 1; i <= L; ++i) {
for (int j = 0; j < leaves[i]; ++j) {
edges.emplace_back(i, cur++);
}
}
for (auto &e : edges)
cout << e.fi << " " << e.se << "\n";
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int t; cin >> t;
for (int i = 0; i < t; i++)
solve();
}
CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgoKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgZW5kbCAiXG4iCiNkZWZpbmUgdmVjIHZlY3RvcgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIElORiBJTlRfTUFYCiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBwaWkgcGFpcjxpbnQsIGludD4KI2RlZmluZSBwaWwgcGFpcjxpbnQsIGxvbmcgbG9uZz4KI2RlZmluZSBwbGkgcGFpcjxsb25nIGxvbmcsIGludD4KI2RlZmluZSBwbGwgcGFpcjxsb25nIGxvbmcsIGxvbmcgbG9uZz4KI2RlZmluZSBzdHIgc3RyaW5nCgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKdXNpbmcgdWxsID0gdW5zaWduZWQgbG9uZyBsb25nOwp1c2luZyB1aSA9IHVuc2lnbmVkIGludDsKCmNvbnN0IGludCBNT0QgPSAxMDAwMDAwMDA3OwoKI2RlZmluZSBhbGwoeCkgeC5iZWdpbigpLCB4LmVuZCgpCiNkZWZpbmUgcmFsbCh4KSB4LnJiZWdpbigpLCB4LnJlbmQoKQoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgc29sdmUoKSB7CiAgICBpbnQgbjsKICAgIGxsIGs7CiAgICBjaW4gPj4gbiA+PiBrOwogICAgX19pbnQxMjggbXggPSAoX19pbnQxMjgpbiAqIChuIC0gMSkgKiAobiAtIDIpIC8gNjsKICAgIGlmIChrID4gbXggKyAxKSB7CiAgICAgICAgY291dCA8PCAiTm9cbiI7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbGwgciA9IGs7CiAgICB2ZWM8aW50PiBTOwogICAgZm9yIChpbnQgcyA9IG4gLSAxOyBzID49IDI7IC0tcykgewogICAgICAgIGxsIGYgPSAobGwpcyAqIChzIC0gMSkgLyAyOwogICAgICAgIGlmIChmIDw9IHIpIHsKICAgICAgICAgICAgUy5wYihzKTsKICAgICAgICAgICAgciAtPSBmOwogICAgICAgIH0KICAgIH0KICAgIGludCBsID0gUy5zaXplKCk7CiAgICBpbnQgTCA9IGwgKyAxOwogICAgdmVjPGxsPiBsZWF2ZXMoTCArIDIsIDApLCBzdWYoTCArIDMsIDApOwogICAgaWYgKGwgPT0gMCkgewogICAgICAgIGxlYXZlc1sxXSA9IG4gLSAxOwogICAgfSBlbHNlIHsKICAgICAgICBpbnQgczEgPSBTWzBdOwogICAgICAgIGxlYXZlc1sxXSA9IChuIC0gMSkgLSBzMTsKICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8PSBMOyArK2kpIHsKICAgICAgICAgICAgaW50IHNpMSA9IFNbaSAtIDJdOwogICAgICAgICAgICBzdWZbaV0gPSBzaTEgLSAoTCAtIChpIC0gMSkpOwogICAgICAgIH0KICAgICAgICBzdWZbTCArIDFdID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8PSBMOyArK2kpIHsKICAgICAgICAgICAgbGVhdmVzW2ldID0gc3VmW2ldIC0gc3VmW2kgKyAxXTsKICAgICAgICB9CiAgICB9CiAgICBjb3V0IDw8ICJZZXNcbiI7CiAgICB2ZWM8cGlpPiBlZGdlczsKICAgIGVkZ2VzLnJlc2VydmUobiAtIDEpOwogICAgZm9yIChpbnQgaSA9IDI7IGkgPD0gTDsgKytpKQogICAgICAgIGVkZ2VzLmVtcGxhY2VfYmFjayhpIC0gMSwgaSk7CiAgICBpbnQgY3VyID0gTCArIDE7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBMOyArK2kpIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlYXZlc1tpXTsgKytqKSB7CiAgICAgICAgICAgIGVkZ2VzLmVtcGxhY2VfYmFjayhpLCBjdXIrKyk7CiAgICAgICAgfQogICAgfQogICAgZm9yIChhdXRvICZlIDogZWRnZXMpCiAgICAgICAgY291dCA8PCBlLmZpIDw8ICIgIiA8PCBlLnNlIDw8ICJcbiI7Cn0KCnNpZ25lZCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNpbi50aWUobnVsbHB0cik7IGNvdXQudGllKG51bGxwdHIpOwogICAgaW50IHQ7IGNpbiA+PiB0OwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0OyBpKyspCiAgICAgICAgc29sdmUoKTsKfQ==