#include <cstdio>
#include <algorithm>
#define max_a 25
#define lim_n 20
#define lim_m 60
#define max_p 20
#define max_e 10000
using namespace std;
int q[max_p+1];
struct node{
	int u,v,w;
	node(){}
	node(int _u,int _v,int _w):u(_u),v(_v),w(_w){}
};
node e[max_e+1];
struct note{
	int u,v,w,k,tg;
	note(){}
	note(int _u,int _v,int _w,int _k,int _tg):u(_u),v(_v),w(_w),k(_k),tg(_tg){}
};
note ext[max_e+1],ext2[max_e+1];

void spl(note*ext,const int&a,const int&remain,int&n,int&m){
	note x;
	switch(a){
		case 6:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*3);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
			}
			break;
		case 7:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*3);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(x.u,x.v,x.w*6);
			}
			break;
		case 8:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*4);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
			}
			break;
		case 9:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*3);
				e[++m]=node(x.u,n,x.w*6);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
			}
			break;
		case 10:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*3);
				e[++m]=node(x.u,n,x.w*6);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(x.u,x.v,x.w*9);
			}
			break;
		case 11:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*3);
				e[++m]=node(x.u,n,x.w*6);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(x.u,x.v,x.w*9);
				e[++m]=node(x.u,x.v,x.w*10);
			}
			break;
		case 12:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*4);
				e[++m]=node(x.u,n,x.w*8);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
			}
			break;
		case 13:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*4);
				e[++m]=node(x.u,n,x.w*8);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
				e[++m]=node(x.u,x.v,x.w*12);
			}
			break;
		case 14:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*4);
				e[++m]=node(x.u,n,x.w*8);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
				e[++m]=node(x.u,x.v,x.w*12);
				e[++m]=node(x.u,x.v,x.w*13);
			}
			break;
		case 15:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*5);
				e[++m]=node(x.u,n,x.w*10);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
				e[++m]=node(n,x.v,x.w<<2);
			}
			break;
		case 16:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*4);
				e[++m]=node(x.u,n,x.w*8);
				e[++m]=node(x.u,n,x.w*12);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
			}
			break;
		case 17:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*4);
				e[++m]=node(x.u,n,x.w*8);
				e[++m]=node(x.u,n,x.w*12);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
				e[++m]=node(x.u,x.v,x.w*16);
			}
			break;
		case 18:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*6);
				e[++m]=node(x.u,n,x.w*12);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
				e[++m]=node(n,x.v,x.w<<2);
				e[++m]=node(n,x.v,x.w*5);
			}
			break;
		case 19:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*6);
				e[++m]=node(x.u,n,x.w*12);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
				e[++m]=node(n,x.v,x.w<<2);
				e[++m]=node(n,x.v,x.w*5);
				e[++m]=node(x.u,x.v,x.w*18);
			}
			break;
		case 20:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*5);
				e[++m]=node(x.u,n,x.w*10);
				e[++m]=node(x.u,n,x.w*15);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
				e[++m]=node(n,x.v,x.w<<2);
			}
			break;
		case 21:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*5);
				e[++m]=node(x.u,n,x.w*10);
				e[++m]=node(x.u,n,x.w*15);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
				e[++m]=node(n,x.v,x.w<<2);
				e[++m]=node(x.u,x.v,x.w*20);
			}
			break;
		case 22:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*5);
				e[++m]=node(x.u,n,x.w*10);
				e[++m]=node(x.u,n,x.w*15);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
				e[++m]=node(n,x.v,x.w<<2);
				e[++m]=node(x.u,x.v,x.w*20);
				e[++m]=node(x.u,x.v,x.w*21);
			}
			break;
		case 23:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*5);
				e[++m]=node(x.u,n,x.w*10);
				e[++m]=node(x.u,n,x.w*15);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
				e[++m]=node(n,x.v,x.w<<2);
				e[++m]=node(x.u,x.v,x.w*20);
				e[++m]=node(x.u,x.v,x.w*21);
				e[++m]=node(x.u,x.v,x.w*22);
			}
			break;
		case 24:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*6);
				e[++m]=node(x.u,n,x.w*12);
				e[++m]=node(x.u,n,x.w*18);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
				e[++m]=node(n,x.v,x.w<<2);
				e[++m]=node(n,x.v,x.w*5);
			}
			break;
		case 25:
			for(int i=0; ++i<=remain; ){
				x=ext[i];
				++n;
				e[++m]=node(x.u,n,0);
				e[++m]=node(x.u,n,x.w*5);
				e[++m]=node(x.u,n,x.w*10);
				e[++m]=node(x.u,n,x.w*15);
				e[++m]=node(x.u,n,x.w*20);
				e[++m]=node(n,x.v,0);
				e[++m]=node(n,x.v,x.w);
				e[++m]=node(n,x.v,x.w<<1);
				e[++m]=node(n,x.v,x.w*3);
				e[++m]=node(n,x.v,x.w<<2);
			}
			break;
		default:
			for(int i=0; ++i<=remain; e[++m]=node(x.u,x.v,0)){
				x=ext[i];
				for(int j=x.w*x.k; j-=x.w; e[++m]=node(x.u,x.v,j));
			}
	}
}
void add(note*ext,const int&l,const int&r,int&m){
	note x;
	for(int i=l; ++i<=r; ){
		x=ext[i];
		for(int j=x.w*x.k+x.tg; (j-=x.w)>=x.tg; e[++m]=node(x.u,x.v,j));
	}
}
void swp(int x,int y,int m){
	for(int i=0; ++i<=m; e[i].u==x?(e[i].u=y):(e[i].u==y&&(e[i].u=x)),e[i].v==x?(e[i].v=y):(e[i].v==y&&(e[i].v=x)));
}
void topu(int m){
	bool flag=0;
	int u,v;
	for(int i=0; ++i<=m; )
		if(e[i].u>e[i].v){
			flag=1,u=e[i].u,v=e[i].v;
			break;
		}
	while(flag){
		flag=0,swp(u,v,m);
		for(int i=0; ++i<=m; )
			if(e[i].u>e[i].v){
				flag=1,u=e[i].u,v=e[i].v;
				break;
			}
	}
}
int main(){
	int l;
	scanf("%d",&l);
	if(l<=lim_m){
		printf("2 %d\n",l);
		for(puts("1 2 0"); --l; printf("1 2 %d\n",l));
		return 0;
	}
	--l;
	for(int a=1,p,m,lst,w,n,tmp,k,k2,t; ++a<=max_a; ){
		for(q[p=1]=(tmp=l)%a,w=1; tmp/=a; q[++p]=tmp%a,w*=a);
		for(lst=p+1,reverse(q+1,q+p+1),q[0]=m=tmp=k=k2=0; q[--lst]==a-1; );
		for(int i=0; ++i<lst; tmp+=q[i]*w,ext[++k]=note(i+1,i+2,w/=a,a,0))
			q[i]&&(ext2[++k2]=note(1,i+1,w,q[i],tmp),1);
		n=lst+1;
		lst&&(ext2[++k2]=note(1,n,w,q[lst]+1,tmp),w/=a);
		for(int j=lst,v; ++j<=p; n=v,w/=a)
			ext[++k]=note(n,v=n+1,w,a,0);
		if((t=n)<lim_n&&a>=6){
			int remain=lim_n-t;
			if(remain>=k){
				spl(ext,a,k,n,m);
				add(ext2,0,k2,m);
			}
			else{
				spl(ext,a,remain,n,m);
				add(ext2,0,k2,m);
			}
			topu(m);
		}
		add(ext,0,k,m);
		add(ext2,0,k2,m);
		if(n<=lim_n&&m<=lim_m){
			printf("%d %d\n",n,m);
			for(int i=0; ++i<=m; printf("%d %d %d\n",e[i].u,e[i].v,e[i].w));
			return 0;
		}
	}
	return 0;
}

Measured memory_bytes: 1748