#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <unordered_map>
using namespace std;
unordered_map<int , bool> mp;
struct node{
int x,y;
};
bool cmp(node a,node b)
{
if(a.x != b.x) return a.x < b.x;
else return a.y < b.y;
}
vector<int> st[10010];
int n,k,m,u,v;
int main()
{
string a,b;
scanf("%d %d",&n,&m);
for(int i = 0; i < m; i++)
{
cin>>a>>b;
if(a.length() == b.length()){
st[abs(stoi(a))].push_back(abs(stoi(b)));
st[abs(stoi(b))].push_back(abs(stoi(a)));
}
mp[abs(stoi(a))*10000+abs(stoi(b))] = mp[abs(stoi(b))*10000+abs(stoi(a))] = true;
}
scanf("%d",&k);
for(int i = 0; i < k; i++){
vector<node> ans;
scanf("%d %d",&u,&v);
for(int j = 0; j < st[abs(u)].size(); j++){
for(int k = 0; k < st[abs(v)].size(); k++){
if(st[abs(u)][j] != abs(v) && st[abs(v)][k] != abs(u) &&mp[st[abs(u)][j]*10000+st[abs(v)][k]] == true)
ans.push_back(node{st[abs(u)][j],st[abs(v)][k]});
}
}
sort(ans.begin(),ans.end(),cmp);
printf("%d\n",ans.size());
for(int k = 0; k < ans.size(); k++){
printf("%04d %04d\n",ans[k].x,ans[k].y);
}
}
return 0;
}