#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <unordered_map>
using namespace std;
const int N = 1e5 + 10;
bool gender[N];
unordered_map<int,vector<int>> map;
//看了y总的视频,要用到映射,我觉得有点麻烦,就嵌套 unordered_map 了
unordered_map<int,unordered_map<int,bool>> ship;
//根据性别找朋友, g : 性别
vector<int> find(vector<int>& fris,bool g){
vector<int> vt;
for(auto per : fris){
if(gender[per] == g)
vt.push_back(per);
}
return vt;
}
//找共同朋友
vector<pair<int,int>> find_com(int a,int b,vector<int>& fa,vector<int>& fb){
vector<pair<int,int>> vpii;
for(auto v1 : fa){
for(auto v2 : fb){
if(v1 != v2 && v1 != b && v2 != a && ship[v1][v2] == 1){
vpii.push_back({v1,v2});
}
}
}
return vpii;
}
int main(){
int n,m;
cin >> n >> m;
for(int i = 0; i < m; i++){
int u,v;
string s1,s2;
cin >> s1 >> s2;
//会出现 -0000; 这个数据,我也是服了
//0 :女性 1 : 男性
//换成字符串处理
if(s1[0] == '-') u = -stoi(s1),gender[u] = 0;
else u = stoi(s1),gender[u] = 1;
if(s2[0] == '-') v = -stoi(s2),gender[v] = 0;
else v = stoi(s2),gender[v] = 1;
//加入 v 的朋友
map[v].push_back(u);
map[u].push_back(v);
//他们之间朋友关系
ship[u][v] = 1;
ship[v][u] = 1;
}
for(auto& k_v : map){
auto& vt = k_v.second;
vt.erase(unique(vt.begin(),vt.end()),vt.end());
sort(vt.begin(),vt.end());
}
int q;
vector<int> fa,fb;
vector<pair<int,int>> fcom;
cin >> q;
while(q --){
int a,b;
cin >> a >> b;
fcom.clear();
fa.clear();
fb.clear();
bool ga,gb;
if(a < 0 && b < 0) ga = gb = 0; //相同性别,都为女, 都找女性朋友
if(a > 0 && b > 0) ga = gb = 1; //都为男
if(a > 0 && b < 0) ga = 1,gb = 0; //一男一女
if(a < 0 && b > 0) ga = 0,gb = 1; //一女一男
a = abs(a),b = abs(b);
//找 a 的 朋友
fa = find(map[a],ga);
//找 b 的 朋友
fb = find(map[b],gb);
//找共同朋友
fcom = find_com(a,b,fa,fb);
cout << fcom.size() << endl;
for(auto& out : fcom){
printf("%04d %04d\n",out.first,out.second);
}
}
return 0;
}
/*避免踩坑:
1.负数表示 男, 正数表示 女;但 0 既可以是负数 也可以是 正数
2.因为总是四个四个的输入,输入也应该是四个四个的输出
3.不能A 的 朋友不能直接 是 B, B的朋友不能直接是 A
*/