#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
struct dian{
ll x,y,bh,sy,pp;
}yd[2500105];
struct edge
{
ll q,z,xg;
}ed[19300005];
ll n,m,t,c,qx[100005],qy[1000005],pdd,ydd,dd[2500005],db,p[2500005],
fa[2500005],dfn[2500005],low[2500005],cnt,pp[2500205];
ll zbb(ll x){
return fa[x]==x?x:zbb(fa[x]);
}
void fjq(ll q,ll z){
ed[++db].q=q,ed[db].z=z,ed[db].xg=dd[q],dd[q]=db;
}
bool cmp1(dian a,dian b){
return a.x==b.x?a.y==b.y?a.bh>b.bh:a.y<b.y:a.x<b.x;
}
bool cmp2(dian a,dian b){
return a.y==b.y?a.x<b.x:a.y<b.y;
}
ll read(){
char c=getchar();
ll s=0;
while(c<'0'||c>'9'){
c=getchar();
}
while(c>='0'&&c<='9'){
s=s*10+c-'0';
c=getchar();
}
return s;
}
void dfs(ll root){
dfn[root]=low[root]=++cnt;
//cout<<root<<':'<<dfn[root]<<endl;
ll son=0;
for(ll i=dd[root];i;i=ed[i].xg){
// //cout<<
ll to=ed[i].z;
//cout<<root<<' '<<to<<endl;
if(dfn[to]){
low[root]=min(low[root],dfn[to]);
}
else{
dfs(to);
if(low[to]>=dfn[root]){
son++;
// cout<<root<<' '<<to<<endl;
if(pp[root]){
// cout<<root<<' '<<to<<endl;
if(dfn[root]==1){
if(son>1)pdd=1;
}
else{
pdd=1;
}
}
//cout<<"pdd"<<root<<' '<<to<<' '<<pdd<<endl;
}
low[root]=min(low[root],low[to]);
}
}
//cout<<root<<';'<<low[root]<<endl;
}
int main(){
// freopen("P1173_7.in","r",stdin);
// freopen("out.out","w",stdout);
scanf("%lld",&t);
while(t--){
ydd=cnt=db=0,
n=read(),m=read(),c=read();
for(ll i=1;i<=c;i++){
qx[i]=read(),qy[i]=read();
}
if(n*m-c<=1){
printf("-1\n");
continue;
}
qx[++c]=0,qy[c]=0;
qx[++c]=0,qy[c]=m+1;
qx[++c]=n+1,qy[c]=0;
qx[++c]=n+1,qy[c]=m+1;
for(ll i=1;i<=c;i++){
fa[i]=i;
for(ll xx=max(1ll,qx[i]-2);xx<=min(n,qx[i]+2);xx++){
for(ll yy=max(1ll,qy[i]-2);yy<=min(qy[i]+2,m);yy++){
if(xx==qx[i]&&yy==qy[i])yd[++ydd]={xx,yy,114514,i};
else yd[++ydd]={xx,yy,0,i};
if(abs(xx-qx[i])<=1||abs(yy-qy[i])<=1){
yd[ydd].pp=1;
}
}
}
}
sort(yd+1,yd+1+ydd,cmp1);
ll td=0,ks=c;
// //cout<<ks<<endl;
for(ll i=1;i<=ydd;i++){
if(yd[i].bh==114514){
if(yd[i+1].x==yd[i].x&&yd[i+1].y==yd[i].y)yd[i+1].bh=114514;
continue;
}
if(yd[i].x==yd[td].x&&yd[i].y==yd[td].y){
pp[td]|=yd[i].pp;
ll xb=zbb(yd[i].sy),yb=zbb(yd[td].sy);
// //cout<<yd[i].x<<' '<<yd[i].y<<' '<<xb<<' '<<yb<<endl;
if(xb!=yb){
fa[xb]=yb;
ks--;
}
// pp[]
continue;
}
yd[++td]=yd[i];
yd[td].bh=td;
pp[td]=yd[i].pp;
// cout<<pp[td]<<' '<<td<<"LLL"<<endl;
dfn[td]=dd[td]=low[td]=0;
}ydd=td;
for(ll i=1;i<=ydd;i++){
// cout<<yd[i].x<<' '<<yd[i].y<<' '<<yd[i].bh<<' '<<yd[i].sy<<endl;
}
for(ll i=2;i<=ydd;i++){
if(yd[i].x==yd[i-1].x&&yd[i].y==yd[i-1].y+1){
ll xb=zbb(yd[i].sy),yb=zbb(yd[i-1].sy);
if(xb!=yb){
continue;
}
fjq(yd[i].bh,yd[i-1].bh),fjq(yd[i-1].bh,yd[i].bh);
}
}
sort(yd+1,yd+1+ydd,cmp2);
for(ll i=2;i<=ydd;i++){
if(yd[i].x==yd[i-1].x+1&&yd[i].y==yd[i-1].y){
ll xb=zbb(yd[i].sy),yb=zbb(yd[i-1].sy);
if(xb!=yb){
continue;
}
fjq(yd[i].bh,yd[i-1].bh),fjq(yd[i-1].bh,yd[i].bh);
}
}
// for(ll i=1;i<=db;i++){
// ////cout<<ed[i].q<<' '<<ed[i].z<<endl;
// }
ll gs=0;
pdd=0;
for(ll i=1;i<=ydd;i++){
if(!dfn[i]){
cnt=0;
gs++;
dfs(i);
//cout<<i<<endl<<endl;
}
// //cout<<yd[i].x<<' '<<yd[i].y<<' '<<yd[i].bh<<' '<<yd[i].sy<<endl;
}
//cout<<gs<<' '<<ks<<"ppp"<<endl;
c-=4;
if(n*m-c==2){
if(gs>1){
printf("0\n");
}
else printf("-1\n");
continue;
}
if(ks!=gs){
printf("0\n");
}
else if(pdd){
printf("1\n");
}
else if(n==1||m==1){
printf("1\n");
}
else printf("2\n");
}
return 0;
}