#include using namespace std; #define rep(i,a,b) for(ll i=a;i=b;i--) #define ll long long #define ull unsigned ll #define ld long double #define bl __int128_t #define fi first #define se second #define vel vector #define vvel vector #define pll pair #define vepll vector #define vvepll vector #define ves vector #define vem vector #define vvem vector #define pmm pair #define vepmm vector #define cleout(i) cout<using PQ=priority_queue,greater>; // 上 右 下 左 vector di={-1, 0, 1, 0}; vector dj={ 0, 1, 0,-1}; vector dx={ 0, 1, 0,-1}; vector dy={ 1, 0,-1, 0}; vector ddx={ 1, 1, 1, 0, -1, -1, -1, 0 }; vector ddy={ 1, 0, -1, -1, -1, 0, 1, 1 }; ll inf=1000000000000000000;//1e18 // LLONG_MAX mt19937_64 rng((ull)chrono::steady_clock::now().time_since_epoch().count()); //[x^M]1/(1-x)^N=comb(N-1+M,M) vvel f(vvel &a){ vvel res(a[0].size(),vel(a.size())); rep(i,0,a.size()){ rep(j,0,a[0].size())res[j][i]=a[i][j]; } return res; } void _solve(){ ll H,W; cin>>H>>W; vvel a(H,vel(W)); rep(i,0,H){ rep(j,0,W)cin>>a[i][j]; } rep(i,0,H){ vel v=a[i]; sort(v.rbegin(),v.rend()); if(v[0]+v[1]>0){ cout<<"infinite\n"; return ; } } a=f(a); rep(i,0,W){ vel v=a[i]; sort(v.rbegin(),v.rend()); if(v[0]+v[1]>0){ cout<<"infinite\n"; return ; } } a=f(a); map ma; rep(i,0,H){ rep(j,0,W)ma[i+j].push_back(a[i][j]); } for(auto it=ma.begin();it!=ma.end();it++){ vel v=it->se; sort(v.rbegin(),v.rend()); if(v.size()>1&&v[0]+v[1]>0){ cout<<"infinite\n"; return ; } } ma.clear(); rep(i,0,H){ rep(j,0,W)ma[i-j].push_back(a[i][j]); } for(auto it=ma.begin();it!=ma.end();it++){ vel v=it->se; sort(v.rbegin(),v.rend()); if(v.size()>1&&v[0]+v[1]>0){ cout<<"infinite\n"; return ; } } cout<<"finite\n"; } int main(){ cin.tie(nullptr); ios_base::sync_with_stdio(false); ll _; bool multitest=1; if(multitest)cin>>_; else _=1; rep(__,0,_){ _solve(); } }