#include <bits/stdc++.h>
using namespace std;
#define int long long
#define vi vector<int>
#define sz(x) (int)x.size()
//2025.4.9
//背下来吧,反正跑不了,这个天梯赛用的还是挺多的
const int N=100010;
int vis[N],arr[1100][1100];
int dis[N];
int n,m,k,d;
int vv[N];
void dijk(int x){//标准的dijk
memset(vis,0,sizeof(vis));
memset(dis,0x3f3f,sizeof(dis));//注意这里有点坑
dis[x]=0;
while(1){
int u=-1;
for(int i=1;i<=n+m;i++){
if(vis[i])continue;
if(u==-1||dis[i]<dis[u]){
u=i;
}
}
if(u==-1)return;
vis[u]=1;
for(int i=1;i<=n+m;i++){
if(dis[u]+arr[u][i]<dis[i]){
dis[i]=dis[u]+arr[u][i];
}
}
}
}
int changee(string a){//这里就是把G1处理成1+n
int b;
if(a[0]=='G'){
a.erase(0,1);
b=stoi(a);
return b+n;
}
b=stoi(a);
return b;
}
void solve(){
memset(arr,0x3f3f,sizeof(arr));
cin>>n>>m>>k>>d;
string a,b;int t;
for(int i=0;i<k;i++){
cin>>a>>b>>t;
int u=changee(a);
int v=changee(b);
arr[u][v]=t;arr[v][u]=t;
}
double ans[N][2];
int cnt=0;
for(int i=n+1;i<=n+m;i++){
dijk(i);
int f=0,minn=0x3f3f;
int s=0;
for(int j=1;j<=n;j++){
s+=dis[j];
if(dis[j]>d){f=1;cnt++;vv[i]=1;break;}
if(dis[j]<minn){
minn=dis[j];
}
}
if(f)continue;
ans[i][0]=minn;//第几个的最小值
ans[i][1]=s*1.0/n;//平均距离
}
if(cnt==m){cout<<"No Solution";return;}
int id=0;int m1=0,m2=0;
for(int i=n+1;i<=n+m;i++){
if(vv[i]){continue;}
if(ans[i][0]>m1){
m1=ans[i][0];
m2=ans[i][1];
id=i;
//cout<<id<<endl;
}else if(ans[i][0]==m1){
if(m2>ans[i][1]){
id=i;
m2=ans[i][1];
}
}
}
cout<<'G'<<id-n<<endl;
printf("%.1lf %.1lf",ans[id][0],ans[id][1]);
}
signed main()
{
solve();
return 0;
}