import std;
void main(string[] args){ if(args.length > 1) if(args[1] == "-debug") DEBUG = 1; solve(); } bool DEBUG = 0; 
void log(A ...)(lazy A a){ if(DEBUG) print(a); }
void print(){ writeln(""); } void print(T)(T t){ writeln(t); } void print(T, A ...)(T t, A a){ std.stdio.write(t, " "), print(a); }
string unsplit(T)(T xs){ return xs.array.to!(string[]).join(" "); }
string scan(){ static string[] ss; while(!ss.length) ss = readln.chomp.split; string res = ss[0]; ss.popFront; return res; }
T scan(T)(){ return scan.to!T; } T[] scan(T)(int n){ return n.iota.map!(i => scan!T()).array; }
T lowerTo(T)(ref T x, T y){ if(x > y) x = y; return x; } T raiseTo(T)(ref T x, T y){ if(x < y) x = y; return x; }

// ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- //

void solve(){
  int l = scan!int;
  E[] ans;
  int i = 0;
  while(l > 1){
    if(l % 2) ans ~= E(i, -1, l - 1);
    ans ~= E(i, i + 1, l / 2);
    if(l > 1) ans ~= E(i, i + 1, 0);
    l /= 2;
    i += 1;
  }
  print(i + 1, ans.length);
  foreach(an; ans){
    print(an.u + 1, (an.v < 0)? (i + 1): (an.v + 1), an.w);
  }
}
struct E{
  int u, v, w;
}