#include<bits/stdc++.h>
using namespace std;
char in[100], out[100];
int A[5][5], B[5][5];
int main(){
	int II;
	for(II=1;II<21;II++){
		int n, i, j, a, x, y, t, cnt,I, c, cnt1, cnt2, l=1;
		//scanf("%d", &n);
		sprintf(in,".%d.in",II);
		freopen(in,"w",stdout);
		n = (II+1)/2;
		printf("%d\n", n);
		for(i=1;i<5;i++){
			for(j=1;j<5;j++){
				//scanf("%d",&A[i][j]);
				c = rand()%5;
				if(c>2) c = 0;
				A[i][j] = c;
				printf("%d",c);
				if(j==4) printf("\n");
				else printf(" ");
			}
		}
		for(I=0;I<n;I++){
			a = rand()%4+1;
			//scanf("%d %d %d %d", &a, &x, &y, &t);
			stack <int> S[5];
			if(a==1){
				for(i=1;i<5;i++){
					for(j=1;j<5;j++){
						if(A[j][i]>0){
							cnt = A[j][i];
							while(!S[i].empty() and cnt == S[i].top()){
								cnt = cnt*2;
								S[i].pop();
							}
							S[i].push(cnt);
						}
					}
					for(j=4;j>S[i].size();j--) B[j][i]=0;
					for(j=S[i].size();j>0;j--){
						B[j][i]=S[i].top();
						S[i].pop();
					}
				}
				A[x][y] = t;
			}else if(a==2){
				for(i=1;i<5;i++){
					for(j=1;j<5;j++){
						if(A[i][j]>0){
							cnt = A[i][j];
							while(!S[i].empty() and cnt == S[i].top()){
								cnt = cnt*2;
								S[i].pop();
							}
							S[i].push(cnt);
						}
					}
					for(j=4;j>S[i].size();j--) B[i][j]=0;
					for(j=S[i].size();j>0;j--){
						B[i][j]=S[i].top();
						S[i].pop();
					}
				}
			}else if(a==3){
				for(i=1;i<5;i++){
					for(j=4;j>0;j--){
						if(A[j][i]>0){
							cnt = A[j][i];
							while(!S[i].empty() and cnt == S[i].top()){
								cnt = cnt*2;
								S[i].pop();
							}
							S[i].push(cnt);
						}
					}
					for(j=1;j<5-S[i].size();j++) B[j][i]=0;
					for(j=5-S[i].size();j<5;j++){
						B[j][i]=S[i].top();
						S[i].pop();
					}
				}
			}else if(a==4){
				for(i=1;i<5;i++){
					for(j=4;j>0;j--){
						if(A[i][j]>0){
							cnt = A[i][j];
							while(!S[i].empty() and cnt == S[i].top()){
								cnt = cnt*2;
								S[i].pop();
							}
							S[i].push(cnt);
						}
					}
					for(j=1;j<5-S[i].size();j++) B[i][j]=0;
					for(j=5-S[i].size();j<5;j++){
						B[i][j]=S[i].top();
						S[i].pop();
					}
				}
			}
			cnt1 = 0;
			cnt2 = 0;
			for(i=1;i<5;i++)
				for(j=1;j<5;j++) if(B[i][j]==0) cnt1+=1;

			for(i=1;i<5;i++)
				for(j=1;j<5;j++) if(B[i][j] != A[i][j]) cnt2=1;

			if(cnt1 == 0){
				II--;
				l = 0;
				break;
			}else if(cnt2 == 1){
				x = rand()%4+1;
				y = rand()%4+1;
				while(B[x][y]>0){
					x = rand()%4+1;
					y = rand()%4+1;
				}
				t = rand()%2+1;
				printf("%d %d %d %d\n",a,x,y,t);
				for(i=1;i<5;i++)
					for(j=1;j<5;j++) A[i][j]=B[i][j];
				A[x][y] = t;
			}else{
				I--;
			}
		}
		if(l==1){
			sprintf(in,".%d.out",II);
			freopen(in,"w",stdout);
			for(i=1;i<5;i++){
				for(j=1;j<5;j++){
					printf("%d ",A[i][j]);
					if(j==4) printf("\n");
					else printf(" ");
				}
			}
		}
	}
}
