#include<bits/stdc++.h>
using namespace std;
int a[300010];
string f[105];
struct node{
string s;
int pos;
}ans[30005];
bool cmp(node a,node b){
if(a.pos!=b.pos) return a.pos<b.pos;
else if(a.s.substr(0,a.pos)!=b.s.substr(0,b.pos)) return a.s.substr(0,a.pos)<b.s.substr(0,b.pos);
else if(a.s.size()!=b.s.size()) return a.s.size()<b.s.size();
else return a.s<b.s;
}
signed main(){
// ios::sync_with_stdio(0);
// cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
int n,k,maxa=-0x3f3f3f3f,tot=0;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
maxa=max(maxa,a[i]);
}
if(k==1){
f[1]="1";
}
else{//f里面存程序员节的号码
long long cnt=1;
while(cnt<=stoi(to_string(n)+to_string(maxa))){
cnt*=k;
f[++tot]=to_string(cnt);
}
}
sort(f+1,f+tot+1);
int num=0;
for(int i=1;i<=n;i++){
string s=to_string(i);
for(int j=1;j<=tot;j++){
if(f[j].substr(0,s.size())==s){
string r=f[j].substr(s.size(),f[j].size()-s.size());
if(r.size()<to_string(a[i]).size()&&r.size()>0&&r[0]!='0'){
num++;
ans[num].s=to_string(i)+" "+r;
ans[num].pos=to_string(i).size();
}
else if(r.size()==to_string(a[i]).size()&&r<=to_string(a[i])&&r.size()>0&&r[0]!='0'){
num++;
ans[num].s=to_string(i)+" "+r;
ans[num].pos=to_string(i).size();
}
}
}
}
cout<<num<<'\n';
sort(ans+1,ans+num+1,cmp);
for(int i=1;i<=num;i++){
cout<<ans[i].s<<'\n';
}
}
return 0;
}
RE错误显示aborted iot trap