#include<bits/stdc++.h>
using namespace std;
using Int = long long;
//INSERT ABOVE HERE
const Int INF = 1e17;
struct edge{
  Int w,u,v,to;
  edge(){}
  edge(Int w,Int u,Int v,Int to):w(w),u(u),v(v),to(to){}
  bool operator<(const edge &a)const{
    if(w!=a.w) return w<a.w;
    if(u!=a.u) return u<a.u;
    return v<a.v;
  }
};
struct UnionFind{
  Int n;
  vector<Int> r,p;
  UnionFind(Int n):n(n),r(n,1),p(n){iota(p.begin(),p.end(),0);}
  Int find(Int x){
    if(x==p[x]) return x;
    return p[x]=find(p[x]);
  }
  Int same(Int x,Int y){
    return find(x)==find(y);
  }
  void unite(Int x,Int y){
    x=find(x);y=find(y);
    if(r[x]<r[y]) swap(x,y);
    r[x]+=r[y];
    p[y]=p[x];
  }
};
struct LowLink{
  Int n,cnt;
  vector<vector<edge> > G;
  vector<Int> sum,used,pre,low,par;
  
  LowLink(Int n):n(n),cnt(0),G(n),sum(n),used(n),pre(n),low(n),par(n){}

  void add_edge(Int u,Int v,Int w){
    G[u].emplace_back(w,u,v,v);
    G[v].emplace_back(w,u,v,u);
  }

  void dfs(Int v,Int p,Int d=0){
    pre[v]=low[v]=d;
    used[v]=1;
    for(auto e:G[v]){
      Int u=e.to;
      if(!used[u]){
	par[u]=v;
	dfs(u,v,d+1);
	low[v]=min(low[v],low[u]);
	sum[v]+=sum[u]+e.w;
      }else if(u!=p){
	low[v]=min(low[v],pre[u]);
        sum[u]+=e.w;
      }      
    }
  }
};



signed main(){
  Int n;
  cin>>n;
  LowLink G(n);
  for(Int i=0;i<n;i++){
    Int u,v;
    cin>>u>>v;
    u--;v--;
    G.add_edge(u,v,0);
  }
  UnionFind uf(n);
  G.dfs(0,-1);

  using P = pair<Int, Int>;
  set<P> br;
  for(Int i=1;i<n;i++)
    if(G.low[i]==G.pre[i]) br.emplace(i,G.par[i]),br.emplace(G.par[i],i);
  
  for(Int v=0;v<n;v++){
    for(auto e:G.G[v]){
      Int u=e.to;
      if(!br.count(P(u,v))) uf.unite(u,v);
    }
  }
    
  Int q;
  cin>>q;
  for(Int i=0;i<q;i++){
    Int a,b;
    cin>>a>>b;
    a--;b--;
    if(uf.same(a,b)) cout<<2<<endl;
    else cout<<1<<endl;
  }
  
  return 0;
}

