#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
const int N=101;
int n,m,cnt,a[N][N];
string str[N][N];
inline void fip(int &rer){
register char ch;
for(ch=0;ch<'0'||ch>'9';ch=getchar());
for(rer=0;ch>='0'&&ch<='9';ch=getchar())
rer=(rer<<3)+(rer<<1)+(ch^48);
}
void reverse(int col){
register int i,j;
for(i=1,j=n;i<j;++i,--j)
swap(a[i][col],a[j][col]);
}
void deal(int x0,int y0,int x1,int y1){
static string s;
s.clear();
s+=(a[x0][y0]==y0? "0":"1");
s+=(a[x1][y0]==y0? "0":"1");
s+=(a[x0][y1]==y0? "0":"1");
s+=(a[x1][y1]==y0? "0":"1");
if(s=="0101")cnt+=4,str[x0][y0]="DRDR";
if(s=="0110")cnt+=4,str[x0][y0]="RDRD";
if(s=="1001")cnt+=4,str[x0][y0]="RURU";
if(s=="1010")cnt+=4,str[x0][y0]="URUR";
if(s=="1100")cnt+=4,str[x0][y0]="ULRU",
reverse(y0),reverse(y1);
}
void print(int x0,int y0,int x1,int y1){
for(auto i:str[x0][y0]){
if(i=='U')printf("0 %d\n",x0);
if(i=='D')printf("0 %d\n",x1);
if(i=='L')printf("1 %d\n",y0);
if(i=='R')printf("1 %d\n",y1);
}
}
int main(){
register int i,j,k;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
for(j=1;j<=m;++j){
fip(k),a[i][j]=k;
if(k!=j&&k!=m+1-j){
puts("NO");return 0;}
}puts("YES");
for(i=n>>1;i>=1;--i)
for(j=m>>1;j>=1;--j)
deal(i,j,n+1-i,m+1-j);
printf("%d\n",cnt);
for(i=n>>1;i>=1;--i)
for(j=m>>1;j>=1;--j)
print(i,j,n+1-i,m+1-j);
return 0;
}
Call me if the explanation is needed.