#include<iostream>
#include<vector>
using namespace std;
int N,M,K,Ds;
int dis[1011][1011];
vector<int>v[1011];
int mindis[1011];
int mindistohouse[1011],atservice[1011],totaldis[1011];
void dfs(int cur,int curdis){
mindis[cur]=curdis;
for(int each:v[cur]){
int temp=curdis+dis[cur][each];
if(temp<mindis[each])dfs(each,temp);
}
}
bool comp(int x,int y){
if(atservice[x]!=atservice[y])return atservice[x]>atservice[y];
if(mindistohouse[x]!=mindistohouse[y])return mindistohouse[x]>mindistohouse[y];
if(totaldis[x]!=totaldis[y])return totaldis[x]<totaldis[y];
return x<y;
}
void read(int&p){
char c;
c=getchar();
if(c=='G'){
p=0;
while(isdigit(c=getchar())){
p=p*10+c-'0';
}
p+=N;
}
else{
p=c-'0';
while(isdigit(c=getchar())){
p=p*10+c-'0';
}
}
}
int main()
{
int i,j,k,l;
cin>>N>>M>>K>>Ds;
getchar();
while(K--){
read(j);
read(k);
read(l);
v[k].emplace_back(j);
v[j].emplace_back(k);
dis[k][j]=dis[j][k]=l;
}
for(i=N+1;i<=N+M;i++){
for(j=1;j<=N+M;j++)mindis[j]=1000000000;
dfs(i,0);
mindistohouse[i]=1000000000;
atservice[i]=1;
totaldis[i]=0;
for(j=1;j<=N;j++){
if(mindis[j]<mindistohouse[i])mindistohouse[i]=mindis[j];
if(mindis[j]>Ds){
atservice[i]=0;
break;
}
totaldis[i]+=mindis[j];
}
}
int ans=N+1;
for(i=N+2;i<=N+M;i++){
if(comp(i,ans)==true)ans=i;
}
if(!atservice[ans]){
cout<<"No Solution";
}
else{
cout<<'G'<<ans-N<<endl;
printf("%.1f %.1f",double(mindistohouse[ans]),double(totaldis[ans])/double(N));
}
}