#include<iostream>
#include<queue>
const long MOD=1000000007L;
using namespace std;
struct NodeType{
long x;
int num;
};
int bfs(long x0){
NodeType e,e1;
if(x0<1||x0>1000000006L) return -1;
x0%=MOD;
queue<NodeType>qu;
e.x=x0;
e.num=0;
qu.push(e);
while(!qu.empty()){
e=qu.front();
qu.pop();
if(e.x==0) return e.num;
if(e.num<=100000){
long x1=(4*e.x+4)%MOD;
e1.x=x1;
e1.num=e.num+1;
qu.push(e1);
long x2=(8*e.x+7)%MOD;
e1.x=x2;
e1.num=e.num+1;
qu.push(e1);
}
}
}
int main(){
long x0;
while(cin>>x0){
cout<<bfs(x0)<<endl;
}
}
#include<bits/stdc++.h>
using namespace std;
#define MAXV 200001
int A[MAXV][MAXV];
int n,m,k;
int sno,eno;
int visited[MAXV];
struct NodeType{
int vno;
int length;
};
int bfs(int sno,int eno){
if(sno==eno) return 0;
NodeType e,e1;
queue<NodeType>qu;
e.vno=sno;e.length=0;
qu.push(e);
visited[e.vno]=1;
while(!qu.empty()){
e=qu.front();qu.pop();
if(e.vno==eno) return e.length-1;
for(int j=0;j<n;j++){
if(A[e.vno][j]!=0){
if(visited[j]==0){
e1.vno=j;
e1.length=e.length+1;
qu.push(e1);
visited[j]=1;
}
}
}
}
}
int main(){
while(scanf("%d%d",&n,&m)==2){
int a,b;
memset(A,0,sizeof(A));
memset(visited,0,sizeof(visited));
for(int i=0;i<n;i++){
cin>>a>>b;
A[a][b]=1;
A[b][a]=1;
}
cin>>k;
for(int i=0;i<k;i++){
cin>>sno>>eno;
cout<<bfs(sno,eno)<<endl;
}
}
}