#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(int)n;i++)
#define all(c) (c).begin(),(c).end()
#define pb push_back
#define dbg(...) do{cerr<<__LINE__<<": ";dbgprint(#__VA_ARGS__, __VA_ARGS__);}while(0);

using namespace std;

namespace std{template<class S,class T>struct hash<pair<S,T>>{size_t operator()(const pair<S,T>&p)const{return ((size_t)1e9+7)*hash<S>()(p.first)+hash<T>()(p.second);}};template<class T>struct hash<vector<T>>{size_t operator()(const vector<T> &v)const{size_t h=0;for(auto i : v)h=h*((size_t)1e9+7)+hash<T>()(i)+1;return h;}};}
template<class T>ostream& operator<<(ostream &os, const vector<T> &v){os<<"[ ";rep(i,v.size())os<<v[i]<<(i==v.size()-1?" ]":", ");return os;}template<class T>ostream& operator<<(ostream &os,const set<T> &v){os<<"{ "; for(const auto &i:v)os<<i<<", ";return os<<"}";}
template<class T,class U>ostream& operator<<(ostream &os,const map<T,U> &v){os<<"{";for(const auto &i:v)os<<" "<<i.first<<": "<<i.second<<",";return os<<"}";}template<class T,class U>ostream& operator<<(ostream &os,const pair<T,U> &p){return os<<"("<<p.first<<", "<<p.second<<")";}
void dbgprint(const string &fmt){cerr<<endl;}template<class H,class... T>void dbgprint(const string &fmt,const H &h,const T&... r){cerr<<fmt.substr(0,fmt.find(","))<<"= "<<h<<" ";dbgprint(fmt.substr(fmt.find(",")+1),r...);}
typedef long long ll;typedef vector<int> vi;typedef pair<int,int> pi;const int inf = (int)1e9;const double INF = 1e12, EPS = 1e-9;

bool visit(const vector<vi> &g, int v, vector<int> &order, vector<int> &color) {
  color[v] = 1;
  for(int e : g[v]) {
    if (color[e] == 2) continue;
    if (color[e] == 1) return false;
    if (!visit(g, e, order, color)) return false;
  }
  order.push_back(v); color[v] = 2;
  return true;
}
bool topologicalSort(const vector<vi> &g, vector<int> &order) {
  int n = g.size();
  vector<int> color(n);
  rep(u, n) if (!color[u] && !visit(g, u, order, color))
    return false;
  reverse(all(order));
  return true;
}

int main(){
	cin.tie(0); cin.sync_with_stdio(0);
	int s, r; cin >> s >> r;
	int S, T, Q;
	vector<vi> g(s);
	
	{
		vi dist(s, inf), rdist(s, inf);
		vector<vector<pi>> e(s);
		rep(i, r){
			int a, b, c; cin >> a >> b >> c; a--; b--;
			e[a].emplace_back(b, c);
			e[b].emplace_back(a, c);
		}
		cin >> S >> T >> Q; S--; T--;
		
		auto dij = [](int s, const vector<vector<pi>> &e, vi &dist){
			int n = e.size();
			priority_queue<pi> q; q.emplace(0, s);
			while(!q.empty()){
				int c, d; tie(d, c) = q.top(); q.pop();
				if(dist[c] < -d) continue;
				dist[c] = -d;
				for(pi p : e[c]){
					int nd = -d + p.second;
					if(dist[p.first] > nd){
						dist[p.first] = nd;
						q.emplace(-nd, p.first);
					}
				}
			}
		};
		dij(S, e, dist);
		dij(T, e, rdist);
		/*
		dbg(dist);
		dbg(rdist);
		*/
		rep(i, s) for(pi p : e[i])
			if(dist[i] + p.second + rdist[p.first] == dist[T])
				g[i].pb(p.first);
	}
	//dbg(g);
	vi ord, rord(s);
	topologicalSort(g, ord);
	//dbg(ord);
	
	vector<pi> in;
	rep(it, Q){
		int a, b; cin >> a >> b; in.emplace_back(a - 1, b - 1);
		if(!(it == Q - 1 || in.size() == 64)) continue;
		vector<unsigned long long > f(s);
		rep(i, in.size()) f[in[i].first] |= 1ull << i;
		for(int i : ord) for(int j : g[i]) f[j] |= f[i];
		rep(i, in.size()) cout << (f[in[i].second] >> i & 1 ? "Yes" : "No") << endl;
		in.clear();
	}
	return 0;
}


Measured memory_bytes: 19600