有错误,待修改
//
// Created by HP on 2020/9/7.
//
#include <iostream>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int n,k,m;
struct node{
string a,b;
};
int cmp(node x,node y){
return abs(stoi(x.a))==abs(stoi(y.a))?abs(stoi(x.b))<abs(stoi(y.b)):abs(stoi(x.a))<abs(stoi(y.a));
}
int g[10010][10010];
map<string ,vector<string>> mate;
int main(){
cin>>n>>m;
string a,b;
for(int i=0;i<m;i++){
cin>>a>>b;
mate[a].push_back(b);
mate[b].push_back(a);
g[abs(stoi(a))][abs(stoi(b))] =1;
g[abs(stoi(b))][abs(stoi(a))] =1;
}
cin>>k;
for(int i=0;i<k;i++){
cin>>a>>b;
vector<node> ans;
if(a.length() == b.length()){ //ab性别相同;
for(int j=0;j<mate[a].size();j++){ //a的伙伴
if(a.length()!=mate[a][j].length())continue;
if(mate[a][j]!=b) //这个伙伴不能直接就是b
for(auto it:mate[mate[a][j]]){ //it 是c的伙伴
if(it.length() == a.length() && it!=a && g[abs(stoi(it))][abs(stoi(b))]){
ans.push_back(node{mate[a][j],it});
}
}
}
}
else { //ab性别不同
for(int j=0;j<mate[a].size();j++){
if(a.length()!=mate[a][j].length() && mate[a][j]!=b){
for(auto it:mate[mate[a][j]]){
if(it.length() ==a.length() && it!=a && g[abs(stoi(it))][abs(stoi(b))]){
ans.push_back(node{mate[a][j],it});
}
}
}
}
}
cout<<ans.size()<<endl;
sort(ans.begin(),ans.end(),cmp);
for(auto it:ans){
printf("%s %s\n",it.a.c_str(),it.b.c_str());
}
}
}