#ifdef Prateek
  #include "Prateek.h"
#else
  #include <bits/stdc++.h>
  using namespace std;
  #define debug(...) 42
#endif
#define int ll
#define all(c) begin(c),end(c)
using ll = long long;
const int MOD = 1e9+7, N = 1e5 + 10; 

struct edge{
   int u, v, w;
};

int32_t main(){
   ios::sync_with_stdio(false);
   cin.tie(NULL);
   int L, R;
   cin >> L >> R;
   int B = L - 1;
   int D = R - L + 1;
   int k = 30;
   while (!(D >> k & 1)) --k;
   int mxN = k + 2;
   vector<edge> Edge;

   auto add = [&](int u, int v, int wt) {
      Edge.push_back({u, v, wt});
   };

   for (int i = 2; i <= mxN; ++i) {
      add(1, i, 1);
      int pw = 1;
      for (int j = 2; j < i; ++j) {
         add(j, i, pw);
         pw *= 2;
      }
   }

   cout << "YES\n";

   if (D - (1 << k) == 0) {
      if (B) {
         mxN++;
         Edge.push_back({mxN - 1, mxN, B});
      }
      cout << mxN << ' ' << Edge.size() << '\n';
      for (auto [u, v, w] : Edge) {
         cout << u << ' ' << v << ' ' << w << '\n';
      }
      return 0;
   }

   mxN++;
   --D;
   add(1, mxN, 1);
   for (int i = 0; i <= k; ++i) {
      if (D >> i & 1) {
         D -= (1 << i);
         add(i + 2, mxN, D + 1);
      }
   }
   
   if (B) {
      mxN++;
      Edge.push_back({mxN - 1, mxN, B});
   }
   cout << mxN << ' ' << Edge.size() << '\n';
   for (auto [u, v, w] : Edge) {
      cout << u << ' ' << v << ' ' << w << '\n';
   }
   return 0;
}