Problem: Gleb is a famous competitive programming teacher from Innopolis. He is planning a trip to N programming camps in the nearest future. Each camp will be held in a different country. For each of them, Gleb needs to apply for a visa. 

For each of these trips Gleb knows three integers: the number of the first day of the trip si, the length of the trip in days leni, and the number of days ti this country's consulate will take to process a visa application and stick a visa in a passport. Gleb has P (1 ≤ P ≤ 2) valid passports and is able to decide which visa he wants to put in which passport.

For each trip, Gleb will have a flight to that country early in the morning of the day si and will return back late in the evening of the day si + leni - 1.

To apply for a visa on the day d, Gleb needs to be in Innopolis in the middle of this day. So he can't apply for a visa while he is on a trip, including the first and the last days. If a trip starts the next day after the end of the other one, Gleb can't apply for a visa between them as well. The earliest Gleb can apply for a visa is day 1.

After applying for a visa of country i on day d, Gleb will get his passport back in the middle of the day d + ti. Consulates use delivery services, so Gleb can get his passport back even if he is not in Innopolis on this day. Gleb can apply for another visa on the same day he received his passport back, if he is in Innopolis this day. 

Gleb will not be able to start his trip on day si if he doesn't has a passport with a visa for the corresponding country in the morning of day si. In particular, the passport should not be in another country's consulate for visa processing.

Help Gleb to decide which visas he needs to receive in which passport, and when he should apply for each visa. 

Input

In the first line of the input there are two integers N (1 ≤ N ≤ 22) and P (1 ≤ P ≤ 2)—the number of trips and the number of passports Gleb has, respectively.

The next N lines describe Gleb's trips. Each line contains three positive integers si, leni, ti (1 ≤ si, leni, ti ≤ 109)—the first day of the trip, the length of the trip and number of days the consulate of this country needs to process a visa application. It is guaranteed that no two trips intersect.

Output

If it is impossible to get all visas on time, just print "NO" (quotes for clarity). Otherwise, print "YES" and N lines describing trips. For each trip, first print number of the passport Gleb should put this country's visa in, and then print number of the day he should apply for it. Print trips in the same order as they appear in the input. Days are numbered from 1, starting with tomorrow—the first day you can apply for a visa. Passports are numbered from 1 to P.

If there are several possible answers, print any of them.

Examples

Input

2 1
3 1 1
6 1 1


Output

YES
1 1
1 4


Input

3 1
13 2 2
7 3 1
19 3 4


Output

YES
1 10
1 1
1 2


Input

7 2
15 1 1
14 1 1
18 1 1
21 1 1
9 4 6
22 2 5
5 4 3


Output

YES
2 13
1 1
1 16
1 19
1 2
2 16
2 1


Input

3 1
7 3 1
13 2 3
19 3 4


Output

NO

Note

Examples with answer "YES" are depicted below.

Each cell of the stripe represents a single day. Rectangles represent trips, each trip starts in the morning and ends in the evening. Rectangles with angled corners represent visa applications. Each application starts in the middle of a day and ends ti days after. The trip and the visa application for the same country have the same color.

In examples with two passports, visa applications and trips depicted above the time stripe are made using the first passport, visa applications and trips depicted below the time stripe are made using the second passport.

Example 1: 

<image>

Example 2: 

<image>

Example 3: 

<image>

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline void chkmin(T1 &x, T2 y) {
  if (x > y) x = y;
}
template <typename T1, typename T2>
inline void chkmax(T1 &x, T2 y) {
  if (x < y) x = y;
}
template <typename T, typename U>
inline ostream &operator<<(ostream &_out, const pair<T, U> &_p) {
  _out << _p.first << ' ' << _p.second;
  return _out;
}
template <typename T, typename U>
inline istream &operator>>(istream &_in, pair<T, U> &_p) {
  _in >> _p.first >> _p.second;
  return _in;
}
template <typename T>
inline ostream &operator<<(ostream &_out, const vector<T> &_v) {
  if (_v.empty()) {
    return _out;
  }
  _out << _v.front();
  for (auto _it = ++_v.begin(); _it != _v.end(); ++_it) {
    _out << ' ' << *_it;
  }
  return _out;
}
template <typename T>
inline istream &operator>>(istream &_in, vector<T> &_v) {
  for (auto &_i : _v) {
    _in >> _i;
  }
  return _in;
}
template <typename T>
inline ostream &operator<<(ostream &_out, const set<T> &_s) {
  if (_s.empty()) {
    return _out;
  }
  _out << *_s.begin();
  for (auto _it = ++_s.begin(); _it != _s.end(); ++_it) {
    _out << ' ' << *_it;
  }
  return _out;
}
template <typename T>
inline ostream &operator<<(ostream &_out, const multiset<T> &_s) {
  if (_s.empty()) {
    return _out;
  }
  _out << *_s.begin();
  for (auto _it = ++_s.begin(); _it != _s.end(); ++_it) {
    _out << ' ' << *_it;
  }
  return _out;
}
template <typename T>
inline ostream &operator<<(ostream &_out, const unordered_set<T> &_s) {
  if (_s.empty()) {
    return _out;
  }
  _out << *_s.begin();
  for (auto _it = ++_s.begin(); _it != _s.end(); ++_it) {
    _out << ' ' << *_it;
  }
  return _out;
}
template <typename T>
inline ostream &operator<<(ostream &_out, const unordered_multiset<T> &_s) {
  if (_s.empty()) {
    return _out;
  }
  _out << *_s.begin();
  for (auto _it = ++_s.begin(); _it != _s.end(); ++_it) {
    _out << ' ' << *_it;
  }
  return _out;
}
template <typename T, typename U>
inline ostream &operator<<(ostream &_out, const map<T, U> &_m) {
  if (_m.empty()) {
    return _out;
  }
  _out << '(' << _m.begin()->first << ": " << _m.begin()->second << ')';
  for (auto _it = ++_m.begin(); _it != _m.end(); ++_it) {
    _out << ", (" << _it->first << ": " << _it->second << ')';
  }
  return _out;
}
template <typename T, typename U>
inline ostream &operator<<(ostream &_out, const unordered_map<T, U> &_m) {
  if (_m.empty()) {
    return _out;
  }
  _out << '(' << _m.begin()->first << ": " << _m.begin()->second << ')';
  for (auto _it = ++_m.begin(); _it != _m.end(); ++_it) {
    _out << ", (" << _it->first << ": " << _it->second << ')';
  }
  return _out;
}
const string FILENAME = "input";
const int INF = 1000000000;
int n, p;
int dp[1 << 22];
int s[22], len[22], t[22];
int id[22];
pair<int, int> pr[1 << 22];
pair<int, int> res[22];
bool comp(int i, int j) { return s[i] < s[j]; }
void restore(int g, int t) {
  if (!g) {
    return;
  }
  int s = pr[g].second;
  res[s] = make_pair(t, pr[g].first);
  restore(g ^ (1 << s), t);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> p;
  for (int i = 0; i < n; i++) {
    cin >> s[i] >> len[i] >> t[i];
    id[i] = i;
  }
  sort(id, id + n, comp);
  for (int i = 1; i < (1 << n); i++) {
    dp[i] = INF;
  }
  dp[0] = 1;
  for (int i = 0; i < (1 << n); i++) {
    if (dp[i] == INF) {
      continue;
    }
    for (int j = 0; j < n; j++) {
      if (i & (1 << j)) {
        continue;
      }
      int g = dp[i];
      for (int p = 0; p < n; p++) {
        int h = id[p];
        if (g + t[j] < s[h]) {
          break;
        }
        if ((i & (1 << h)) || g >= s[h]) {
          chkmax(g, s[h] + len[h]);
        }
      }
      if (g + t[j] >= s[j]) {
        continue;
      }
      if (dp[i ^ (1 << j)] > g + t[j]) {
        dp[i ^ (1 << j)] = g + t[j];
        pr[i ^ (1 << j)] = {g, j};
      }
    }
  }
  if (p == 1) {
    if (dp[(1 << n) - 1] == INF) {
      cout << "NO\n";
      return 0;
      ;
    }
    cout << "YES\n";
    restore((1 << n) - 1, 1);
    for (int i = 0; i < n; i++) {
      cout << res[i].first << ' ' << res[i].second << '\n';
    }
    return 0;
  }
  int g = -1;
  for (int i = 0; i < (1 << n); i++) {
    if (dp[i] < INF && dp[((1 << n) - 1) ^ i] < INF) {
      g = i;
    }
  }
  if (g == -1) {
    cout << "NO\n";
    return 0;
  }
  cout << "YES\n";
  restore(g, 1);
  restore(((1 << n) - 1) ^ g, 2);
  for (int i = 0; i < n; i++) {
    cout << res[i].first << ' ' << res[i].second << '\n';
  }
  return 0;
}