#include <bits/stdc++.h>
int IntMaxVal = (int)1e20;
int IntMinVal = (int)-1e20;
long long LongMaxVal = (long long)1e20;
long long LongMinVal = (int)-1e20;
template <typename T>
struct argument_type;
template <typename T, typename U>
struct argument_type<T(U)> {};
using namespace std;
template <typename T1, typename T2>
istream& operator>>(istream& is, pair<T1, T2>& s) {
  is >> s.first >> s.second;
  return is;
}
void solve() {
  int n;
  cin >> n;
  ;
  int p;
  cin >> p;
  ;
  vector<pair<int, int> > edges;
  bool hasEdge[n + 1][n + 1];
  for (int i = 1; i < n + 1; ++i)
    for (int j = 1; j < n + 1; ++j) hasEdge[i][j] = false;
  vector<int> edgeCount(n + 1, 4);
  for (int i = 1; i < n + 1; ++i) {
    int to = i + 1;
    if (to > n) to -= n;
    edges.push_back(make_pair(i, to));
    hasEdge[i][to] = hasEdge[to][i] = true;
    to = i + 2;
    if (to > n) to -= n;
    edges.push_back(make_pair(i, to));
    hasEdge[i][to] = hasEdge[to][i] = true;
  }
  while (edges.size() < 2 * n + p) {
    int x1 = 1, x2 = 1;
    while (edgeCount[x1] == n - 1) x1++;
    x2 = x1 + 1;
    while (hasEdge[x1][x2]) x2++;
    edges.push_back(make_pair(x1, x2));
    hasEdge[x1][x2] = hasEdge[x2][x1] = true;
    edgeCount[x1]++;
    edgeCount[x2]++;
  }
  for (auto p : edges) cout << p.first << ' ' << p.second << endl;
}
int main() {
  srand(time(NULL));
  ios_base::sync_with_stdio(false);
  int t;
  cin >> t;
  ;
  while (t-- > 0) solve();
}
