/*************************************************************************
ID:panzhiz1
PROG:Lawnmower
LANG:C++
Created Time: 2014/3/25 10:15:44
************************************************************************/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<fstream>
#include<algorithm>
#include<iterator>
//#define _SMALL
using namespace std;
int a[101][101];
const int Max=10003;
typedef struct Point{
int x,y;
}point;
vector<point> vi_point;
vector<point>::iterator iter;
inline bool isok(vector<point> vi,int n,int m)
{
if(n==1||m==1) return true;
iter=vi.begin();
while(iter!=vi.end())
{
int row=iter->x;
int col=iter->y;
//check thar row or col is safe
int i,j;
int c=a[row][col];
for(i=0,j=0;(i<m&&a[row][i]<=c)||(j<n&&a[j][col]<=c);) //check row and col either safe
{
if(a[row][i]<=c)
i++;
else
j++;
}
//if(i>=m||j>=col) //row or col is safe ,demo it is Yes
if(i<m&&j<n)
return false;
iter++;
}
return true;
}
int main(){
int n,m;
int ncase;
int testcase=1;
#ifdef _SMALL
ifstream cin("B-small-practice.in");
#else
ifstream cin("B-large-practice.in");
#endif
ofstream cout("result.out");
cin>>ncase;
// ncase=5;
while(ncase--)
{
cin>>n>>m;
vi_point.clear();
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>a[i][j];
#ifdef _SMALL
if(a[i][j]==1){
#endif
point p;
p.x=i;
p.y=j;
//cout<<p.x<<p.y<<endl;
vi_point.push_back(p);
#ifdef _SMALL
}
#endif
}
if(isok(vi_point,n,m))
cout<<"Case #"<<testcase++<<": YES"<<endl;
else
cout<<"Case #"<<testcase++<<": NO"<<endl;
}
// system("pause");
return 0;
}