//#define LOCAL
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a, b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define DNF 0x7f
#define DBG printf("this is a input\n")
#define fi first
#define se second
#define mk(a, b) make_pair(a,b)
#define p_queue priority_queue
ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b) {
return a / gcd(a, b) * b;
}
//前向星
int n, m;
int head[400010], cnt;
struct e{
int t, next;
}edge[400010*2],dedge[400010*2];
void add(int f, int t)
{
edge[cnt].t = t;
edge[cnt].next = head[f];
head[f] = cnt ++;
}
//tarjan求割边
int bridge[400010];
int dfn[400010] ,low[400010], times;
void tarjan(int u, int id)
{
dfn[u] = low[u] = ++times;
for(int i = head[u] ; i != -1 ; i = edge[i].next)
{
int v = edge[i].t;
if(!dfn[v])
{
tarjan(v,i);
low[u] = min (low[u] , low[v]);
if(low[v] > dfn[u])
bridge[i] = bridge[i^1] = 1;
}
else if(i != (id ^ 1)) // 如果有重边
low[u] = min(low[u], dfn[v]);
}
}
//处理ecc
int ecc[400010], type;
void dfs(int u, int block)
{
ecc[u] = block;
for(int i = head[u] ; i != - 1 ; i = edge[i].next)
{
if(!bridge[i])
{
int v = edge[i].t;
if(!ecc[v])
dfs(v,block);
}
}
}
//建立新图
map <pair<int,int>,int> ma;
int dhead[400010], dcnt;
void dadd(int f, int t)
{
dedge[dcnt].t = t;
dedge[dcnt].next = dhead[f];
dhead[f] = dcnt ++;
}
//lca
int bz[200010][30] , dp[200010] , dep[200010];
void lca_dfs(int u , int deep)
{
dep[u] = deep;
for(int i = dhead[u] ; i != -1 ; i = dedge[i].next)
{
int v = dedge[i].t;
if(!dep[v])
{
bz[v][0] = u;
dp[v] = dp[u] + 1;
lca_dfs(v,deep+1);
}
}
}
void deal()
{
for(int i = 1 ; i <= 25 ; i ++)
{
for(int j = 1 ; j <= type ; j ++)
{
bz[j][i] = bz[bz[j][i-1]][i-1];
}
}
}
int LCA(int x, int y)
{
if(dep[x] < dep[y])
swap(x,y);
for(int i = 25 ; i >= 0 ; i --)
if(dep[bz[x][i]] >= dep[y])
x = bz[x][i];
if(x == y) return x;
for(int i = 25 ; i >= 0 ; i --)
if(bz[x][i] ^ bz[y][i])
x = bz[x][i] , y = bz[y][i];
return bz[x][0];
}
int main(void)
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
freopen("odata.out", "w", stdout);
#endif
mem(head,-1);
mem(dhead,-1);
scanf("%d %d",&n , &m);
int u , v;
for (int i = 1; i <= m; i++)
{
scanf("%d %d",&u , &v);
add (u , v);
add (v , u);
}
for(int i = 1 ; i <= n ; i ++) {
if (!dfn[i])
tarjan(i, -1);
}
for(int i = 1 ; i <= n ; i ++){
if(!ecc[i]) {
++ type;
dfs(i, type);
}
}
for(int i = 1 ; i <= n ; i ++)
{
for(int j = head[i] ; j != -1 ; j = edge[j].next)
{
v = edge[j].t;
int x = ecc[i] , y = ecc[v];
if(x < y)
swap(x,y);
if(x != y && !ma[mk(x,y)])
{
ma[mk(x,y)] = 1;
dadd(x,y), dadd(y, x);
}
}
}
lca_dfs(1,1);
deal();
int k ;
scanf("%d",&k);
for(int i = 1 ;i <= k ; i ++)
{
scanf("%d %d",&u , &v);
int lca = LCA(ecc[u],ecc[v]);
cout<<dp[ecc[u]] + dp[ecc[v]] - 2 * dp[lca]<<endl;
}
}