//NiceDuck
#include "bits/stdc++.h"
typedef long long ll;
using namespace std;
#define FILE "000"
#define foru(i,a,b) for(int i=(int)(a); i<=(int)(b); ++i)
#define ford(i,a,b) for(int i=(int)(a); i>=(int)(b); --i)
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);
#define pb push_back
#define fi first
#define se second
#define el "\n"
#define MASK(i) (1LL<<(i))
#define BIT(i,j) (((i)>>(j))&1)
#define TIME 1.0*clock()/CLOCKS_PER_SEC
#define LOG 20

const ll MAX=1e5+5;
int n,m,q;
vector<pair<int,int> > adj[MAX];

int compCount,compID[MAX];
stack<int> st;
int timer=0,low[MAX],num[MAX];
void dfs(int u, int id)
{
    num[u]=low[u]=++timer;
    st.push(u);
    for(pair<int,int> pa:adj[u])
    {
        int v=pa.fi, idx=pa.se;
        if(idx==id) continue;
        if(num[v]) low[u]=min(low[u],num[v]);
        else
        {
            dfs(v,idx);
            low[u]=min(low[u],low[v]);
            if(low[v]>num[u])
            {
                ++compCount;
                while(true)
                {
                    int t=st.top(); st.pop();
                    compID[t]=compCount;
                    if(t==v) break;
                }
            }
        }
    }
}
vector<pair<int,int> > adjTree[MAX];
int logn,h[MAX],jump[LOG][MAX],dist[LOG][MAX];
void dfs1(int u, int p)
{
    for(pair<int,int> pa:adjTree[u])
    {
        int v=pa.fi, w=pa.se;
        if(v==p) continue;
        h[v]=h[u]+1;
        jump[0][v]=u;
        dist[0][v]=w;
        dfs1(v,u);
    }
}

void buildLCA()
{
    dfs1(1,0);
    logn=31-__builtin_clz(compCount);
    foru(j,1,logn)
    {
        foru(i,1,compCount)
        {
            int t=jump[j-1][i];
            jump[j][i]=jump[j-1][t];
            dist[j][i]=dist[j-1][i]+dist[j-1][t];
        }
    }
}

void pre()
{
    dfs(1,0);
    if(!st.empty())
    {
        ++compCount;
        while(!st.empty())
        {
            int u=st.top(); st.pop();
            compID[u]=compCount;
        }
    }
    foru(i,1,n)
    {
        for(pair<int,int> pa:adj[i])
        {
            int j=pa.fi;
            int u=compID[i], v=compID[j];
            if(u!=v) adjTree[u].pb({v,1});
        }
    }
    buildLCA();
}

int calc(int u, int v)
{
    u=compID[u]; v=compID[v];
    if(u==v) return 0;
    if(h[u]>h[v]) swap(u,v);
    int k=h[v]-h[u],ans=0;
//    cout<<u<<' '<<v<<' '<<k<<el;
    ford(j,logn,0)
    {
        if(BIT(k,j))
        {
            ans+=dist[j][v];
            v=jump[j][v];
//            cout<<j<<' '<<v<<el;
        }
    }
//    cout<<el;
//    cout<<u<<' '<<v<<el;
    if(u==v) return ans;
    ford(j,logn,0)
    {
        if(jump[j][u]!=jump[j][v])
        {
            ans+=dist[j][v]+dist[j][u];
            u=jump[j][u]; v=jump[j][v];
        }
    }
    return ans+dist[0][u]+dist[0][v];
}

int main()
{
    fastio
    if(fopen(FILE ".inp","r"))
    {
        freopen(FILE ".inp","r",stdin); freopen(FILE ".out","w",stdout);
    }
    cin>>n>>m;
    foru(i,1,m)
    {
        int u,v; cin>>u>>v;
        adj[u].pb({v,i});
        adj[v].pb({u,i});
    }
    pre();
    cin>>q;
    while(q--)
    {
        int u,v; cin>>u>>v;
        cout<<calc(u,v)<<el;
    }

    return 0;
}
