//#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[100005], cnt;
struct e{
int t, next;
}edge[200005*2];
void add(int f, int t)
{
edge[cnt].t = t;
edge[cnt].next = head[f];
head[f] = cnt ++;
}
int dfn[100005], low[100005] , fa[100005], vec[100005], times;
int dep[100005], ans;
void init()
{
mem(head,-1);
mem(dfn, 0);
mem(low,-1);
mem(fa,0);
mem(vec,0);
mem(dep,0);
times = cnt = ans = 0;
}
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])
{
fa[v] = u;
dep[v] = dep[u] + 1;
tarjan(v,i);
low[u] = min(low[u] , low[v]);
if(low[v] > dfn[u]) vec[v] = 1, ans ++;//桥塞给节点
}
else if(i != (id^1))
low[u] = min(low[u], dfn[v]);
}
}
void LCA(int u , int v)
{
int vertex[100005];
int tot = 0;
if(dep[u] < dep[v])
swap(u,v);
while(dep[u] > dep[v])
{
if(vec[u])
{
vec[u] = 0;
ans --;
}
vertex[++ tot] = u;
u = fa[u];
}
while(u != v)
{
if(vec[u]) ans --, vec[u] = 0;
if(vec[v]) ans --, vec[v] = 0;
vertex[++ tot] = u;
vertex[++ tot] = v;
u = fa[u];
v = fa[v];
}
int lca = u;
for(int i = 1 ; i <= tot ; i ++)
fa[vertex[i]] = lca;
return ;
}
int main(void)
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
freopen("odata.out", "w", stdout);
#endif
int Case = 1;
while(scanf("%d %d",&n , &m) != EOF)
{
if(n == 0 && m == 0)
break;
init();
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]) {
fa[i] = i;
dep[i] = 1;
tarjan(i, 0);
}
}
printf("Case %d:\n",Case ++);
int q;
scanf("%d", &q);
while(q --)
{
scanf("%d %d",&u , &v);
LCA(u,v);
printf("%d\n",ans);
}
printf("\n");
}
}