import sys sys.setrecursionlimit(1 << 25) def main(): import sys input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]); idx +=1 M = int(data[idx]); idx +=1 edges = [[] for _ in range(N+1)] for _ in range(M): u = int(data[idx]); idx +=1 v = int(data[idx]); idx +=1 edges[u].append(v) edges[v].append(u) Q = int(data[idx]); idx +=1 queries = [] for _ in range(Q): x = int(data[idx]); idx +=1 y = int(data[idx]); idx +=1 queries.append( (x, y) ) parent = [0]*(N+1) disc = [0]*(N+1) low = [0]*(N+1) time_counter = [1] is_cut = [False]*(N+1) def dfs(u, visited, parent_node): visited.add(u) disc[u] = low[u] = time_counter[0] time_counter[0] +=1 child = 0 for v in edges[u]: if v == parent_node: continue if v not in visited: parent[v] = u dfs(v, visited, u) low[u] = min( low[u], low[v] ) if parent_node != -1 and low[v] >= disc[u]: is_cut[u] = True child +=1 else: low[u] = min( low[u], disc[v] ) if parent_node == -1 and child >=2: is_cut[u] = True visited = set() for i in range(1, N+1): if i not in visited: dfs(i, visited, -1) for (x, y) in queries: if x == y: print(0) continue count = 0 for v in range(1, N+1): if v == x or v == y: continue if not is_cut[v]: continue visited_x = set() stack = [x] visited_x.add(x) while stack: u = stack.pop() for nei in edges[u]: if nei == v: continue if nei not in visited_x: visited_x.add(nei) stack.append(nei) if y not in visited_x: count +=1 print(count) if __name__ == "__main__": main()