#include<iostream>#include<cstring>#include<cstdio>#include<queue>#include<cstdlib>#include<cmath>#include<stack>#include<map>#include<string>#include<vector>#include<set>#include<bitset>#include<algorithm>usingnamespace std;#define ll long long#define INF 0x3f3f3f3f#define LINF 0x3f3f3f3f3f3f3f3f#define ull unsigned long long#define endl '\n'#define clr(a, b) memset(a, b, sizeof(a))#define lowbit(x) x & -x#define lson rt << 1, l, mid#define rson rt << 1 | 1, mid + 1, r#define PB push_back#define POP pop_backconstdouble pi =acos(-1);constint maxn =1e5+10;constint maxm =(maxn<<5)+5;const ll mod =1e9+7;constint hash_mod =19260817;int T, n, m, id;
vector<int> f[maxn], z[maxn];int fa[maxn][64], du[maxn], top[maxn], h[maxn];voidtopsort(){
queue<int> que;for(int i =1; i <= n ;++ i){if(!du[i]) que.push(i);}while(!que.empty()){int u = que.front();
que.pop();
top[++id]= u;for(int i =0; i < f[u].size();++ i){int v = f[u][i];-- du[v];if(!du[v]) que.push(v);}}}voidinit(){
id =0;for(int i =1; i <= n ;++ i){
z[i].clear(); f[i].clear();
du[i]=0; h[i]=0;}}intlca(int x,int y){if(h[x]< h[y])swap(x, y);int k = h[x]- h[y];for(int i =31; i >=0;-- i){if((k >> i)&1) x = fa[x][i];}if(x == y)return x;for(int i =31; i >=0;-- i){if(fa[x][i]!= fa[y][i]) x = fa[x][i], y = fa[y][i];}return fa[x][0];}intmain(){//freopen("E://one.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取//freopen("E://oneout.txt","w",stdout); //输出重定向,输出数据将保存在out.txt文件中int u, v, q;scanf("%d",&T);while(T --){scanf("%d %d",&n,&m);init();for(int i =1; i <= m ;++ i){scanf("%d %d",&u,&v);
du[u]++;
f[v].PB(u); z[u].PB(v);}topsort();for(int i =1; i <= n ;++ i){int u = top[i];int x =(z[u].size()==0?0: z[u][0]);for(int i =0; i < z[u].size();++ i){int v = z[u][i];
x =lca(x, v);}
h[u]= h[x]+1;
fa[u][0]= x;for(int i =1; i <=31;++ i) fa[u][i]= fa[fa[u][i-1]][i-1];}scanf("%d",&q);while(q --){scanf("%d %d",&u,&v);
cout << h[u]+ h[v]- h[lca(u, v)]<< endl;}}return0;}