#include<bits/stdc++.h>
#define re register
using namespace std;
inline long long read(){
re long long x=0,f=1;re char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*f;
}
struct Edge{
long long from,to,pre;
} edge[100005],e[100005];
long long last[10005],cnt=1,nlast[10005],ncnt=1;;
void add(long long x,long long y){
++cnt;
edge[cnt].from=x;
edge[cnt].to=y;
edge[cnt].pre=last[x];
last[x]=cnt;
}
void nadd(long long x,long long y){
++ncnt;
e[ncnt].from=x;
e[ncnt].to=y;
e[ncnt].pre=nlast[x];
nlast[x]=ncnt;
}
long long dfn[10005],low[10005];
bool bridge[100005];
long long num=0,qnum[10005];
void tarjan(long long x,long long y){
dfn[x]=low[x]=++num;
for(long long i=last[x];i;i=edge[i].pre){
long long v=edge[i].to;
if(!dfn[v]){
tarjan(v,i);
low[x]=min(low[x],low[v]);
if(low[v]>dfn[x]){
bridge[i]=bridge[i^1]=true;
++qnum[0];
qnum[qnum[0]]=i;
}
}
else if((i^1)!=y) low[x]=min(low[x],dfn[v]);
}
return;
}
long long sltnum=0,belong[10005];
void dfs(long long x){
belong[x]=sltnum;
for(long long i=last[x];i;i=edge[i].pre){
if(bridge[i]||belong[edge[i].to]) continue;
dfs(edge[i].to);
}
return;
}
long long f[100005][18],deep[100005];
void st(long long x,long long fa){
deep[x]=deep[fa]+1;
for(int i=nlast[x];i;i=e[i].pre){
if(e[i].to==fa) continue;
f[e[i].to][0]=x;
st(e[i].to,x);
}
long long len=log2(deep[x])+1;
for(int i=1;i<=len;++i) f[x][i]=f[f[x][i-1]][i-1];
return;
}
long long LCA(long long x,long long y){
if(deep[x]>deep[y]) swap(x,y);
int len=log2(deep[y]-deep[x])+1;
for(int i=len;i>=0;--i){
if(deep[f[y][i]]>=deep[x]) y=f[y][i];
}
if(x==y) return x;
len=log2(deep[x])+1;
for(int i=len;i>=0;--i){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
void write(long long x){
if(x==0){
printf("0");
return;
}
if(x==1){
printf("1");
return;
}
write(x>>1);
printf("%lld",x%2);
}
long long n,m,q;
int main(){
n=read(); m=read();
long long u,v;
for(int i=1;i<=m;++i){
u=read(); v=read();
add(u,v);
add(v,u);
}
tarjan(1,0);
for(int i=1;i<=n;++i){
if(!belong[i]){
++sltnum;
dfs(i);
}
}
for(int i=1;i<=qnum[0];++i){
nadd(belong[edge[qnum[i]].from],belong[edge[qnum[i]].to]);
nadd(belong[edge[qnum[i]].to],belong[edge[qnum[i]].from]);
}
q=read();
st(1,0);
long long a,b;
for(int i=1;i<=q;++i){
a=read(); b=read();
a=belong[a]; b=belong[b];
write(deep[a]+deep[b]-2*deep[LCA(a,b)]+1);
printf("\n");
}
return 0;
}