#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int N=32006;
int Lun,NOD,ctc,q,n,m,v[N],poz[N],tati[N],fii[N],ctcon[N],X[N],Y[N],reprez[N],x[N],y[N];
bool f[N],usedY[N],usedX[N],proc[N];
vector<int> L[N],LT[N];
vector<pair<int,int> > NewG[N];
priority_queue<pair<int,int> > H;
void read()
{
int x,y;
freopen("obiective.in","r",stdin);
freopen("obiective.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(x!=y)
{
bool ok=true;
for(vector<int>::iterator it=L[x].begin();it!=L[x].end();it++)
if(*it==y)
ok=false;
if(ok)
{
L[x].push_back(y);
LT[y].push_back(x);
}
}
}
}
void makevec(int nod)
{
f[nod]=true;
for(vector<int>::iterator it=L[nod].begin();it!=L[nod].end();it++)
if(!f[*it])
makevec(*it);
v[++q]=nod;
poz[nod]=q;
}
void init()
{
for(int i=1;i<=n;i++)
if(!f[i])
makevec(i);
}
void reset(bool f[N])
{
for(int i=1;i<=n;i++)
f[i]=false;
}
void dfs(int nod)
{
f[poz[nod]]=true;
for(vector<int>::iterator it=LT[nod].begin();it!=LT[nod].end();it++)
if(!f[poz[*it]])
dfs(*it);
ctcon[nod]=ctc;
}
void makectc()
{
for(int i=n;i>=1;i--)
if(!f[i])
{
ctc++;
reprez[ctc]=v[i];
dfs(v[i]);
}
}
void init2()
{
for(int i=1;i<=n;i++)
for(vector<int>::iterator it=L[i].begin();it!=L[i].end();it++)
if(ctcon[i]!=ctcon[*it])
{
bool ok=true;
for(vector<pair<int,int> >::iterator it2=NewG[ctcon[i]].begin();it2!=NewG[ctcon[i]].end();it2++)
if(it2->first==ctcon[i])
{
ok=false;
if(it2->second==1)
it2->second=0;
}
if(ok)
{
NewG[ctcon[i]].push_back(make_pair(ctcon[*it],0));
bool ok=true;
for(vector<pair<int,int> >::iterator it2=NewG[ctcon[*it]].begin();it2!=NewG[ctcon[*it]].end();it2++)
if(it2->first==ctcon[*it])
ok=false;
if(ok)
NewG[ctcon[*it]].push_back(make_pair(ctcon[i],1));
}
}
}
void resetdij()
{
for(int i=1;i<=ctc;i++)
proc[i]=false;
while(!H.empty())
H.pop();
}
void dijkstra(int st,int fin)
{
H.push(make_pair(0,st));
while(!H.empty())
{
pair<int,int> nod=H.top();
H.pop();
if(!proc[nod.second])
{
proc[nod.second]=true;
if(nod.second==fin)
{
printf("%d\n",-nod.first);
return;
}
for(vector<pair<int,int> >::iterator it=NewG[nod.second].begin();it!=NewG[nod.second].end();it++)
if(!proc[it->first])
H.push(make_pair(nod.first-it->second,it->first));
}
}
}
void solve()
{
int x,y,k;
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
resetdij();
scanf("%d%d",&x,&y);
if(ctcon[x]==ctcon[y])
{
printf("0\n");
continue;
}
dijkstra(ctcon[x],ctcon[y]);
}
}
int main()
{
read();
init();
reset(f);
makectc();
init2();
solve();
return 0;
}