#include <bits/stdc++.h>
using namespace std;
struct READ {
  int d1, d2, d3;
  READ(int d1 = -1, int d2 = -1, int d3 = -1) : d1(d1), d2(d2), d3(d3) {}
  template <class T>
  operator T() {
    T tmp;
    this->read(tmp);
    return tmp;
  }
  template <class T>
  void read(T& t) {
    cin >> t;
  }
  template <class T>
  void read(vector<T>& cont) {
    assert(d1 != -1);
    cont.resize(d1);
    READ r(d2, d3);
    for (int i = 0; i < d1; ++i) r.read(cont[i]);
  }
  template <class T1, class T2>
  void read(pair<T1, T2>& x) {
    read(x.first);
    read(x.second);
  }
};
vector<pair<int, int>> solve(int n, int k) {
  int64_t combs = (int64_t)k * (k - 1);
  if (combs < n) return {};
  vector<pair<int, int>> result;
  for (int diff = 1;; diff += 1) {
    for (int x = 1; x <= k; ++x) {
      result.emplace_back(x, (x + diff - 1) % k + 1);
      if (result.size() >= n) return result;
    }
  }
}
int main(int argc, char* argv[]) {
  int n = READ();
  int k = READ();
  vector<pair<int, int>> result = solve(n, k);
  if (result.empty()) {
    cout << "NO" << endl;
  } else {
    cout << "YES" << endl;
    for (auto& p : result) {
      cout << p.first << " " << p.second << endl;
    }
  }
  return 0;
}
