#include <bits/stdc++.h>
using namespace std;
int n, m, k, Q;
vector <pair <int, long long>> g[100001];
int r[100001];
vector <pair <int, long long>> h[100001];
int root(int u){
	if(r[u]<0) return u;
	return r[u]=root(r[u]);
}
bool unite(int u, int v){
	u=root(u);
	v=root(v);
	if(u==v) return 0;
	if(r[u]>r[v]) swap(u, v);
	r[u]+=r[v];
	r[v]=u;
	return 1;
}
set <int> b[100001];
long long f[100001];
pair <long long, pair <int, int>> be[100001];
class loli{
public:
	int v, s;
	long long w;
	loli(int v, long long w, int s): v(v), w(w), s(s){};
};
class cmp{
public:
	bool operator()(loli A, loli B){
		return A.w>B.w;
	}
};
priority_queue <loli, vector <loli>, cmp> q;
bool done[100001];
int ac[100001][20];
long long w[100001][20];
int d[100001];
void dfs(int u){
	done[u]=1;
	for(int i=0; ac[ac[u][i]][i]; i++){
		ac[u][i+1]=ac[ac[u][i]][i];
		w[u][i+1]=max(w[u][i], w[ac[u][i]][i]);
	}
	for(auto v: h[u]) if(!done[v.first]){
		d[v.first]=d[u]+1;
		ac[v.first][0]=u;
		w[v.first][0]=v.second;
		dfs(v.first);
	}
}
long long get(int u, int v){
	long long res=0;
	if(d[u]<d[v]) swap(u, v);
	bool moved=0;
	for(int i=__lg(d[u]); i>=0; i--) if(d[ac[u][i]]>=d[v]){
		res=max(res, w[u][i]);
		u=ac[u][i];
	}
	if(u==v) return res;
	for(int i=__lg(d[u]); i>=0; i--) if(ac[u][i]!=ac[v][i]){
		res=max(res, w[u][i]);
		res=max(res, w[v][i]);
		u=ac[u][i];
		v=ac[v][i];
	}
	res=max(res, w[u][0]);
	res=max(res, w[v][0]);
	return res;
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n>>m>>k>>Q;
	for(int i=1, u, v, w; i<=m; i++){
		cin>>u>>v>>w;
		g[u].push_back({v, w});
		g[v].push_back({u, w});
		// cerr<<u<<' '<<v<<' '<<w<<'\n';
	}
	for(int i=1; i<=k; i++) r[i]=-1;
	int sz=k;
	// cerr<<"OK\n";
	while(sz>1){
		for(int i=1; i<=n; i++) b[i].clear();
		for(int i=1; i<=n; i++) f[i]=0;
		for(int i=1; i<=k; i++)	q.push(loli(i, 0, root(i)));
		for(int i=1; i<=k; i++)	if(i==root(i)) be[i]={1e18, {-1, -1}};
		while(!q.empty()){
			int v=q.top().v;
			int s=q.top().s;
			long long w=q.top().w;
			q.pop();
			if(b[v].size()==2) continue;
			if((!b[v].empty())&&(s==*b[v].begin())) continue;
			b[v].insert(s);
			f[v]+=w;
			for(auto x: g[v])	if(b[x.first].size()<2) q.push(loli(x.first, w+x.second, s));
		}
		for(int i=1; i<=k; i++){
			int fi=*b[i].begin();
			int se=*b[i].rbegin();
			be[fi]=min(be[fi], {f[i], {fi, se}});
			be[se]=min(be[se], {f[i], {se, fi}});
		}
		for(int i=1; i<=k; i++) if(i==root(i)){
			if(unite(be[i].second.first, be[i].second.second)){
				// cerr<<i<<' '<<be[i].first<<'\n';
				// cerr<<be[i].second.first<<' '<<be[i].second.second<<' '<<be[i].first<<'\n';
				sz--;
				h[be[i].second.first].push_back({be[i].second.second, be[i].first});
				h[be[i].second.second].push_back({be[i].second.first, be[i].first});
			}
		}
	}
	d[1]=1;
		// cerr<<sz<<'\n';
	dfs(1);
	// cerr<<"OK\n";
	for(int i=1, u, v; i<=Q; i++){
		// cerr<<sz<<'\n';
		cin>>u>>v;
		// cerr<<sz<<'\n';
		cout<<get(u, v)<<'\n';
	}
}