                 //       ONLY FOR KING RAHMANI MASTER OF DP       \\

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define int long long
#define lb(a) ((a)&(-a))
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
std::mt19937 rnd(std::chrono::steady_clock::now().time_since_epoch().count());
using namespace __gnu_pbds;
using namespace std;

const int maxn=1e6+11,maxm=10+13,mod=998244353;

int  h[maxn],lca1[maxm][maxn],lca[maxm][maxn],f[maxm],par[maxn],n,m,k,q,dp[maxn],dp1[maxn];

vector <pair<int,int> > adg[maxn];

vector <pair<int,int> > adg1[maxn];

vector <pair<int,pair<int,int> > > v1;

set <pair<int,int> > s;

set <pair<int,int> > ::iterator it;

bool mark[maxn];

pair<int,int> p;

int root(int v)
{
    return par[v]==-1 ? v : par[v]=root(v);
}

void merg(int v,int u,int c)
{
    int xx=root(v),yy=root(u);
    if(xx!=yy)
    {
        par[xx]=par[yy];
        adg1[v].push_back(make_pair(u,c));
        adg1[u].push_back(make_pair(v,c));
    }
}

void dfs(int v)
{
    for(int i=1;f[i]<=h[v];i++)
    {
        lca[i][v]=max(lca[i-1][v],lca[i-1][lca1[i-1][v]]);
        lca1[i][v]=lca1[i-1][lca1[i-1][v]];
    }
    mark[v]=1;
    for(auto u:adg1[v])
    {
        if(!mark[u.first])
        {
            lca[0][u.first]=u.second;
            lca1[0][u.first]=v;
            h[u.first]=h[v]+1;
            dfs(u.first);
        }
    }
}

int get(int v,int u)
{
   // cout<<"c "<<h[v]<<' '<<h[u]<<endl;
    int mm=0;
    if(h[v]>h[u])
        swap(v,u);
    int h1=h[u]-h[v];
    for(int i=22;i>=0;i--)
    {
        if(f[i]<=h1)
        {
            mm=max(mm,lca[i][u]);
            u=lca1[i][u];
            h1-=f[i];
        }
    }
    if(v==u)
       return mm;
    //cout<<"yyyyyy"<<endl;
    for(int i=22;i>=0;i--)
    {
        if(lca1[i][v]!=lca1[i][u])
        {
            mm=max(lca[i][v],mm);
            mm=max(lca[i][u],mm);
            v=lca1[i][v];
            u=lca1[i][u];
        }
    }
    mm=max(max(lca[0][v],lca[0][u]),mm);
    return mm;
}

int32_t main()
{
    ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
  //    1103 1097 1193 10087 10133 11021 1119 10007
  //  cout<<setprecision(9);
  //  cout<<std::fixed;
  //  http://78.157.45.46/ss4-12r2
    f[0]=1;
    for(int i=1;i<maxm;i++)
        f[i]=f[i-1]*2;
    cin>>n>>m>>k>>q;
    for(int a,b,c,i=0;i<m;i++)
    {
        cin>>a>>b>>c;
        adg[a].push_back(make_pair(b,c));
        adg[b].push_back(make_pair(a,c));
        v1.push_back(make_pair(c,make_pair(a,b)));
    }
    for(int i=1;i<=k;i++){
        s.insert(make_pair(0,i));
        dp1[i]=i;
    }
    for(int i=k+1;i<=n;i++){
        s.insert(make_pair(1e17,i));
        dp[i]=1e17;
    }
    while(!s.empty())
    {
        p=*s.begin();
        it=s.begin();
        mark[p.second]=1;
        s.erase(it);
        for(auto uu:adg[p.second])
        {
            if(!mark[uu.first])
            {
                if(p.first+uu.second<dp[uu.first])
                {
                    it=s.lower_bound(make_pair(dp[uu.first],uu.first));
                    s.erase(it);
                    s.insert(make_pair(p.first+uu.second,uu.first));
                    dp[uu.first]=p.first+uu.second;
                    dp1[uu.first]=dp1[p.second];
                }
            }
        }
    }
    for(int i=0;i<v1.size();i++)
    {
        //if(v1[i].second.second>k && v1[i].second.first>k)
        v1[i].first+=dp[v1[i].second.first]+dp[v1[i].second.second];
        v1[i].second.first=dp1[v1[i].second.first];
        v1[i].second.second=dp1[v1[i].second.second];
        //cout<<"a "<<v1[i].second.first<<' '<<v1[i].second.second<<' '<<v1[i].first<<' '<<dp[v1[i].second.first]<<' '<<dp[v1[i].second.second]<<endl;
    }
    sort(v1.begin(),v1.end());
   // cout<<"a "<<v1.size()<<endl;
    memset(par,-1,sizeof par);
    for(auto pp:v1)
    {
        merg(pp.second.first,pp.second.second,pp.first);
    }
    memset(mark,0,sizeof mark);
    dfs(1);
    for(int a1,b1,i=0;i<q;i++)
    {
        cin>>a1>>b1;
        cout<<get(a1,b1)<<endl;
    }
    return 0;
}
