#include <bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int T,n,tt;
long long k,m[N],ans[N],maxn;
struct node{ int m,d; }nd[500];
bool cmp(node a,node b){
if(a.m!=b.m) return a.m<b.m;
return a.d<b.d;
}
int len(long long x){
int ret=0;
while(x>0){ ret+=1; x/=10;}
return ret;
}
long long pj(int a,long long b){
long long ret=a;
int k=len(b);
while(k--) ret*=10;
return ret+b;
}
void csh(){
ans[tt=0]=1;
long long end=pj(n,maxn);
while(ans[tt]<=end){
tt++;
ans[tt]=ans[tt-1]*k;
}
sort(ans,ans+tt);
}
void deal(){
maxn=0;
scanf("%d%lld",&n,&k);
for(int i=1;i<=n;i++) {scanf("%lld",&m[i]);maxn=max(maxn,m[i]);}
if(k==1){ printf("0\n"); return ;}
csh();
int cnt=0;
for(int i=1;i<tt;i++){
if(ans[i]<11) continue;
long long tmp=ans[i];
long long power=10,left,right;;
do{
left=tmp/power,right=tmp%power;
if(left<=n&&right<=m[left]&&right!=tmp%(power/10)){
nd[cnt].m=left,nd[cnt].d=right;
cnt++;
}
power*=10;
}while(left>0);
}
if(cnt==0){ printf("0\n"); return ;}
sort(nd,nd+cnt,cmp);
printf("%d\n",cnt);
for(int i=0;i<cnt;i++) printf("%d %d\n",nd[i].m,nd[i].d);
printf("\n");
}
int main(){
scanf("%d",&T);
while(T--){
deal();
}
return 0;
}