#include<iostream>
#include<vector>
#include<unordered_map>
#include<cmath>
#include<algorithm>
using namespace std;
vector<int> v[10000];
unordered_map<int,bool> arr;//用数组表示的话数组太稀疏了
struct node{
int fa,fb;
};
bool cmp(node x,node y){
if(x.fa!=y.fa)
return x.fa<y.fa;
return x.fb<y.fb;
}
int main(){
int N,M,K,p1,p2;
string a,b;
scanf("%d%d",&N,&M);
for(int i=0;i<M;i++){
cin>>a>>b;
p1=abs(stoi(a));p2=abs(stoi(b));
if(a.length()==b.length()){//是同性朋友
v[p1].push_back(p2);
v[p2].push_back(p1);
}
arr[p1*10000+p2]=arr[p2*10000+p1]=true;
}
scanf("%d",&K);
for(int i=0;i<K;i++){
vector<node> ans;
scanf("%d%d",&p1,&p2);
p1=abs(p1);p2=abs(p2);
for(int j=0;j<v[p1].size();j++){
for(int k=0;k<v[p2].size();k++){
int f1=v[p1][j],f2=v[p2][k];
if(f1==p2||f2==p1) continue;
if(arr[f1*10000+f2]==true)
ans.push_back(node{f1,f2});
}
}
sort(ans.begin(),ans.end(),cmp);
printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++)
printf("%04d %04d\n",ans[i].fa,ans[i].fb);
}
return 0;
}