#include<cstdio>
#include<vector>

using namespace std;

int n,m;
vector<int> tomo[1001];
int ss[1001];


void saiki(int s,int dps){
		ss[s]=1;
	if(dps==2){
		return;
	}
	for(int i=0;i<tomo[s].size();i++){
		saiki(tomo[s][i],dps+1);
	}
}
	

int main(){
	while(1){
	scanf("%d%d",&n,&m);
	if(n==0&&m==0){
		break;
	}
	for(int i=0;i<1001;i++){
		ss[i]=0;		
		tomo[i].clear();
	}
	for(int i=0;i<m;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		tomo[a].push_back(b);
		tomo[b].push_back(a);
	}
	
	saiki(1,0);
	
	int cont=0;
	for(int i=2;i<=n;i++){
		cont+=ss[i];
	}
	printf("%d\n",cont);
	}
}
#include <bits/stdc++.h>
using namespace std;

#define LIMIT 100001

int N, Q, K;
vector<map<long long, long long>> nodeDis(LIMIT);
vector<long long> kToNode(LIMIT);
vector<bool> check(LIMIT);
vector<unordered_set<int>> vg(LIMIT);

void makeDistance(int k, long long dis){
  check[k] = true;
  kToNode[k] = dis;
  for(auto x: vg[k]){
    if(check[x]){
      continue;
    }
    makeDistance(x, dis + nodeDis[k].at(x));
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout << setprecision(20) << fixed;
  cin >> N;
  for(int i = 0; i < N-1; i++){
    long long a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    nodeDis[a][b] = c;
    nodeDis[b][a] = c;
    vg[a].insert(b);
    vg[b].insert(a);
  }
  cin >> Q >> K;
  K--;
  makeDistance(K, 0);
  /*
  for(int i = 0; i < N; i++){
    cout << i << " " << kToNode[i] <<endl;
  }
  //*/
  for(int i = 0; i < Q; i++){
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    cout << kToNode[a] + kToNode[b] <<endl;
  }
}
