#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <set>
#include <algorithm>
using namespace std;
#define rep(i,j,k) for (int i = j; i < k; i++)
const int maxn=10000,dis=10000;
unordered_map<int,bool> mp;
struct node{
int p,q;
};
bool cmp(node a,node b){
if(a.p!=b.p)
return a.p<b.p;
return a.q<b.q;
}
int main(){
//read();
int n,m,k;
string a,b;
cin>>n>>m;
vector<int> v[10000];
rep(i,0,m){
cin>>a>>b;
int na=abs(stoi(a)),nb=abs(stoi(b));
if(a.size() == b.size()){
v[na].push_back(nb);
v[nb].push_back(na);
}
mp[na*dis+nb] = mp[nb*dis+na] = true;
}
cin>>k;
rep(i,0,k){
int na,nb;
cin>>na>>nb;
vector<node> ans;
rep(j,0,v[abs(na)].size()){
rep(k,0,v[abs(nb)].size()){
//直接找到的异性朋友就是对象时,舍弃
if (v[abs(na)][j] == abs(nb) || abs(na) == v[abs(nb)][k]) continue;
if (mp[v[abs(na)][j] * 10000 + v[abs(nb)][k]] == true){
node no = {v[abs(na)][j], v[abs(nb)][k]};
ans.push_back(no);
}
}
}
sort(ans.begin(),ans.end(),cmp);
printf("%d\n",ans.size());
rep(j,0,ans.size()){
printf("%04d %04d\n",ans[j].p,ans[j].q);
}
}
printf("");
return 0;
}