/*求最小的块移动求逆序*/
#include<stdio.h>
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<queue>
#include<algorithm>
#include<math.h>
#define M 1000
using namespace std;
void ans(int n)
{
int pos=1;
while(pos!=n)
{
printf("%d %d %d\n",(n-pos)/2+pos,2,pos/2);
pos+=2;
}
printf("%d %d %d\n",1,(n-1)/2,(n-1)/2);
}
int main()
{
int n;
scanf("%d",&n);
if(n==1)printf("0\n");
else if(n==2)
{
printf("1\n");
printf("%d %d %d\n",1,1,1);
}
else if(n&1)
{
printf("%d\n",(int)ceil((n+1)/2.0));
ans(n);
}
else
{
printf("%d\n",(int)ceil((n+1)/2.0));
ans(n-1);
printf("%d %d %d\n",n,1,0);
}
}