#include <fstream>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <string.h>
#include <queue>
#include <math.h>
#include <set>
 
#define min(a,b) ((a<b)?a:b)
#define max(a,b) ((a<b)?b:a)
#define abs(a) ((a<0)?-a:a)
#define REP(i,a,b) \
	for (int i=a; i<=b; i++)
 
#define INF 10000000000001
 
using namespace std;
 
#define TEST
#ifndef TEST
ifstream fin ("vacation.in");
ofstream fout ("vacation.out");
#else
#define fin cin
#define fout cout
#endif
 
#define MAXN 200

typedef long long ll;

int n,k,m,q;

ll a[MAXN][MAXN];

int rez=0;
ll sum = 0;

void Floyd()
{
    REP(ic,0,n-1)
	{
        REP(jc,0,n-1)
		{
            REP(kc,0,n-1)
			{
                if ((kc==jc) || (kc==ic) || (ic==jc)) continue;
                else  a[jc][kc]=min(a[jc][kc],a[jc][ic]+a[ic][kc]);
			}
		}
	}
}

int main()
{
	fin>>n>>m>>k>>q;

	REP(i,0,n-1)
		REP(j,0,n-1)
			a[i][j]=INF;

	for (int i=0; i<n; i++)
		a[i][i]=0;

	for (int i=0; i<m; i++)
	{
		int x,y,c;
		fin>>x>>y>>c;
		a[x-1][y-1]=c;
	}

	Floyd();

	for (int i=0; i<q; i++)
	{
		int x,y;
		fin>>x>>y;
		ll r = INF;
		for (int j=0; j<k; j++)
			r = min(r, a[x-1][j]+a[j][y-1]);
		if (r==INF) continue;
		rez++;
		sum+=r;
	}

	fout<<rez;
	fout<<'\n';
	fout<<sum;
	fout<<'\n';

    return 0;
}