OI XXXI - wys

// https://szkopul.edu.pl/problemset/problem/vi23594m9-57bDiIC-M_ydYe/site/?key=statement

#include <bits/stdc++.h>

// #define GARY_DBG
#define GARY_LIB

constexpr int sizik = 1000 * 1001, sizik2 = 22;

#define ar std::array

typedef std::vector<std::vector<int>> _kra;

std::vector<std::pair<int, int>> kra[sizik];
std::vector<int> kra1[sizik];

int tin[sizik], low[sizik], curr;
int pre[sizik], post[sizik], timer;
int up[sizik][sizik2];
int pref[sizik], orog[sizik];

bool isBridge[sizik];

void DFS1(int v, int edge_id, int p) {
    low[v] = tin[v] = ++curr;
    pre[v] = ++timer;
    up[v][0] = p;
    for (int i = 1; i < sizik2; i++) {
        up[v][i] = up[up[v][i - 1]][i - 1];
    }
    for (const auto& [u, id] : kra[v]) {
        if (edge_id == id) continue;
        if (tin[u] > 0) {
            low[v] = std::min(low[v], tin[u]);
        } else {
            kra1[v].push_back(u);
            kra1[u].push_back(v);

            DFS1(u, id, v);
            low[v] = std::min(low[v], low[u]);

            if (low[u] > tin[v]) {
                isBridge[id] = 1;
            }
        }
    }
    post[v] = ++timer;
}

bool is_ancestor(int v, int u) {
    return pre[v] <= pre[u] && post[u] <= post[v];
}

int lca(int a, int b) {
    if (is_ancestor(a, b)) return a;
    if (is_ancestor(b, a)) return b;
    for (int i = sizik2 - 1; i >= 0; i--) {
        if (!is_ancestor(up[a][i], b)) {
            a = up[a][i];
        }
    }
    return up[a][0];
}

int parent_lca(int a, int b) {
    int l = lca(a, b);
    if (l == 1) return 0;
    return up[l][0];
}

void DFS2(int v, int p) {
    pref[v] += pref[p];
    for (const auto& u : kra1[v]) {
        if (u == p) continue;
        DFS2(u, v);
    }
}

int query(int a, int b) {
    int l = lca(a, b);
    int x = pref[a] + pref[b] - 2 * pref[l] + orog[l];
    return x;
}

void solve() {
    int n, m;
    std::cin >> n >> m;

    for (int i = 1; i <= m; i++) {
        int a, b;
        std::cin >> a >> b;

        kra[a].push_back({b, i});
        kra[b].push_back({a, i});
    }

    DFS1(1, -1, 1);

    int wyn = 0;
    for (int i = 1; i <= n; i++) {
        orog[i] = pref[i] = 1;
        for (const auto& [u, id] : kra[i]) {
            if (!isBridge[id]) {
                wyn++;
                orog[i] = pref[i] = 0;
                break;
            }
        }
    }

    DFS2(1, -1);

    std::cout << wyn << '\n';

    int q;
    std::cin >> q;

    for (; q > 0; q--) {
        int x, y;
        std::cin >> x >> y;

        int res = query(x, y);
        int ans = wyn + res;
        std::cout << ans << '\n';
    }
}

int32_t main() {
#ifndef GARY_DBG
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
#endif

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}