#include<bits/stdc++.h>usingnamespace std;constint N =1020;constint INF =0x3f3f3f3f;int n, m, S, T, k, r;int g[N][N], dist[N];bool st[N];intget(string str){if(str[0]=='G')return n +stoi(str.substr(1));returnstoi(str);}voiddijkstra(int start,int& minD,int& minSum){memset(dist,0x3f,sizeof dist);memset(st,false,sizeof st);
dist[start]=0;for(int i =0; i < n + k; i++){int t =-1;for(int j =1; j <= n + k; j++)if(!st[j]&&(t ==-1|| dist[t]> dist[j]))
t = j;
st[t]=true;for(int j =1; j <= n + k; j++){if(dist[j]> dist[t]+ g[t][j])
dist[j]= dist[t]+ g[t][j];}}for(int i =1; i <= n; i++){if(dist[i]> r){
minD =-INF;return;}}
minD = INF, minSum =0;for(int i =1; i <= n; i++){if(dist[i]< minD) minD = dist[i];
minSum += dist[i];}}intmain(){memset(g,0x3f,sizeof g);
cin >> n >> k >> m >> r;// n屋m路k加油站r范围for(int i =0; i < m; i++){
string a, b;int d;
cin >> a >> b >> d;int x =get(a), y =get(b);
g[x][y]= g[y][x]= d;}int minDist =0, minSum = INF, res =-1;for(int i = n +1; i <= n + k; i++){int d1, d2;//该加油站与房屋的最短距离和距离之和dijkstra(i, d1, d2);if(d1 > minDist) minDist = d1, minSum = d2, res = i;if(d1 == minDist && d2 < minSum) minSum = d2, res = i;}if(res ==-1)puts("No Solution");elseprintf("G%d\n%.1f %.1f", res - n,double(minDist),double(minSum)/ n +1e-8);}