#include <stdio.h>
#include <memory.h>
//#define ONLINE_JUDGE
#ifndef ONLINE_JUDGE
#define CalcScore
#endif
int n, m, c, L, R, D, left[105], right[105], le;
int Count[55], C;
int mark[105][105], a[105][105], t;
#ifdef CalcScore
#define pl 0
int b[105][105], ans[10005][2], l, mark2[105][105];
void out(char *mes, int b[105][105])
{
int i, j;
printf("%s\n", mes);
for (i=m+pl; i>=1-pl; i--)
{
for (j=1-pl; j<=n+pl; j++)
printf("%2d ", b[j][i]);
printf("\n");
}
}
int dfs2(int b[105][105], int mark2[105][105], int x, int y, int c)
{
int t=b[y][x], res=1;
mark2[y][x]=c;
if (mark2[y][x-1]!=c && b[y][x-1]==t)
res+=dfs2(b, mark2, x-1, y, c);
if (mark2[y][x+1]!=c && b[y][x+1]==t)
res+=dfs2(b, mark2, x+1, y, c);
if (mark2[y-1][x]!=c && b[y-1][x]==t)
res+=dfs2(b, mark2, x, y-1, c);
if (mark2[y+1][x]!=c && b[y+1][x]==t)
res+=dfs2(b, mark2, x, y+1, c);
return res;
}
int kill(int x, int y)
{
int t, i, j, k;
memset(mark2, 0, sizeof(mark2));
if (b[y][x]==-1 || (t=dfs2(b, mark2, x, y, 1))==1) return 0;
for (i=0; i<=m+1; i++)
b[0][i]=b[n+1][i]=-1;
for (j=1; j<=n; j++)
{
b[j][0]=-1;
for (i=k=1; b[j][i]!=-1; i++)
if (!mark2[j][i])
b[j][k++]=b[j][i];
while (k<=m+1)
b[j][k++]=-1;
}
return t*(t-1);
}
#endif
void dfs(int x, int y)
{
mark[y][x]=C;
if (mark[y][x-1]!=C && a[y][x-1]==t)
{
if (x<=D) D=x-1;
dfs(x-1, y);
}
if (mark[y][x+1]!=C && a[y][x+1]==t)
dfs(x+1, y);
if (mark[y-1][x]!=C && a[y-1][x]==t)
{
if (y<=L) L=y-1;
dfs(x, y-1);
}
if (mark[y+1][x]!=C && a[y+1][x]==t)
{
if (y>=R) R=y+1;
dfs(x, y+1);
}
}
char buf[35000];
char s[300], *T;
void solve(void)
{
int i, j, i1, j1, k, q, M, cc;
memset(Count, 0, sizeof(Count));
for (i=m; i>=1; i--)
for (j=1; j<=n; j++)
Count[a[j][i]]++;
C=1;
for (cc=i=0; i<c; i++)
if (Count[i]>Count[cc]) cc=i;
memset(mark, 0, sizeof(mark));
#ifdef CalcScore
memcpy(b, a, sizeof(b));
l=0;
#endif
M=m;
le=1;
for (i=1; i<=M; i++)
left[i]=1, right[i]=n;
for (i=M; i>=1; i--)
{
for (j=left[i]; j<=right[i]; j++, C++)
if ((t=a[j][i])!=-1 && t!=cc)
{
L=R=j, D=i;
if (a[j+1][i]!=t && a[j][i-1]!=t && a[j-1][i]!=t && a[j][i+1]!=t) continue;
dfs(i, j);
q=0;
for (i1=k=D; (t=a[L][i1])!=-1; i1++)
{
if (t==a[L-1][i1]) q--;
if (mark[L][i1]!=C)
if (a[L-1][k++]==t) q++;
}
for (i1=k=D; (t=a[R][i1])!=-1; i1++)
{
if (t==a[R+1][i1]) q--;
if (mark[R][i1]!=C)
if (a[R+1][k++]==t) q++;
}
if (q<-3) continue;
#ifdef CalcScore
ans[l][0]=i;
ans[l][1]=j;
l++;
#else
t=m-i;
if (t>=10) *T=t/10+'0', T++, *T=t%10+'0', T++, *T=' ', T++;
else *T=t+'0', T++, *T=' ', T++;
t=j-1;
if (t>=10) *T=t/10+'0', T++, *T=t%10+'0', T++, *T='\n', T++;
else *T=t+'0', T++, *T='\n', T++;
#endif
for (j1=L; j1<=R; j1++)
{
i1=D;
while (mark[j1][i1]!=C) i1++;
for (k=i1; (t=a[j1][i1])!=-1; i1++)
if (mark[j1][i1]!=C)
{
a[j1][k]=t;
if (k>i)
{
if (j1<left[k]) left[k]=j1;
if (j1>right[k]) right[k]=j1;
}
k++;
}
while (k<i1)
a[j1][k++]=-1;
}
i=M-1, j=left[i]-1;
}
right[i]=0, left[i]=n+1;
while (1)
{
while (le<=n && a[le][M]==-1) le++;
if (le>n) M--, le=1;
else break;
}
if (i>M) i=M+1;
}
for (i=1; i<=M; i++)
left[i]=1, right[i]=n;
for (i=M; i>=1; i--)
{
for (j=left[i]; j<=right[i]; j++, C++)
if ((t=a[j][i])!=-1)
{
L=R=j, D=i;
if (a[j+1][i]!=t && a[j][i-1]!=t && a[j-1][i]!=t && a[j][i+1]!=t) continue;
dfs(i, j);
#ifdef CalcScore
ans[l][0]=i;
ans[l][1]=j;
l++;
#else
t=m-i;
if (t>=10) *T=t/10+'0', T++, *T=t%10+'0', T++, *T=' ', T++;
else *T=t+'0', T++, *T=' ', T++;
t=j-1;
if (t>=10) *T=t/10+'0', T++, *T=t%10+'0', T++, *T='\n', T++;
else *T=t+'0', T++, *T='\n', T++;
#endif
for (j1=L; j1<=R; j1++)
{
i1=D;
while (mark[j1][i1]!=C) i1++;
for (k=i1; (t=a[j1][i1])!=-1; i1++)
if (mark[j1][i1]!=C)
{
a[j1][k]=t;
if (k>i)
{
if (j1<left[k]) left[k]=j1;
if (j1>right[k]) right[k]=j1;
}
k++;
}
while (k<i1)
a[j1][k++]=-1;
}
}
right[i]=0, left[i]=n+1;
while (1)
{
while (le<=n && a[le][M]==-1) le++;
if (le>n) M--, le=1;
else break;
}
if (i>M) i=M+1;
}
}
int main(void)
{
int i, j, tn, nt, t;
#ifndef ONLINE_JUDGE
freopen("ZJAWB.in", "r", stdin);
freopen("ZJAWB.out", "w", stdout);
#endif
scanf("%d", &nt);
buf[0]='Y';
buf[1]='\n';
for (tn=0; tn<nt; tn++)
{
scanf("%d%d%d\n", &m, &n, &c);
for (i=m; i; i--)
{
gets(s);
T=s;
for (j=1; j<=n; j++)
{
if (*(T+1)>='0') a[j][i]=((*T)-'0')*10+T[1]-'0', T+=3;
else a[j][i]=(*T)-'0', T+=2;
}
}
for (i=0; i<=n+1; i++)
a[i][0]=a[i][m+1]=-1;
for (i=1; i<=m; i++)
a[0][i]=a[n+1][i]=-1;
T=buf+2;
solve();
*T=0;
printf("%s", buf);
#ifdef CalcScore
j=0;
for (i=0; i<l; i++)
{
t=kill(ans[i][0],ans[i][1]);if (t==0) printf("ERROR\n");j+=t;
// printf("%d", j);out("", b);
}
printf("%d -1 -1\n", j);
#else
puts("-1 -1");
#endif
}
return 0;
}