rt
#include<bits/stdc++.h>
using namespace std;
const int N=30009,M=60009;
int n,m,k;
int vis[N],sz[N],mx[N];
int s[N],sc[N],sav[N];
int rt,S,maxn,ans=0,ansmax;
int f[N],g[N];
struct edge{
int v,w,nxt;
}edg[M*2],e[N*2];
int cntedge,hd[N];
int ncnt,nhd[N];
void add(int u,int v,int w){
cntedge++;
edg[cntedge]=(edge){v,w,hd[u]};
hd[u]=cntedge;
}
void nadd(int u,int v,int w){
ncnt++;
e[ncnt]=(edge){v,w,nhd[u]};
nhd[u]=ncnt;
}
struct node{
int u,dis;
bool operator<(const node A)const{
return dis>A.dis;
}
};
void dij(){
memset(s,0x3f,sizeof(s));
s[1]=0;
priority_queue<node> qq;
qq.push((node){1,0});
node now;int u,v,w;
while(!qq.empty()){
now=qq.top();qq.pop();
u=now.u;
if(s[u]!=now.dis)
continue;
for(int i=hd[u];i;i=edg[i].nxt){
v=edg[i].v;w=edg[i].w;
if(s[v]>s[u]+w){
s[v]=s[u]+w;
qq.push((node){v,s[v]});
}
}
}
return;
}
int q[N],nowcnt;
void dfs(int u){
vis[u]=1;
int v,w,l,r;
l=nowcnt+1;
for(int i=hd[u];i;i=edg[i].nxt){
v=edg[i].v;w=edg[i].w;
if(vis[v]||s[v]!=s[u]+w)
continue;
nadd(u,v,w);
nadd(v,u,w);
q[++nowcnt]=v;
}
r=nowcnt;
sort(q+l,q+r+1);
for(int i=l;i<=r;i++)
dfs(q[i]);
return;
}
void getrt(int u,int fa){
sz[u]=1;mx[u]=0;
int v;
for(int i=hd[u];i;i=edg[i].nxt){
v=edg[i].v;
if(v==fa||vis[v])
continue;
getrt(v,u);
sz[u]+=sz[v];
mx[u]=max(mx[u],sz[v]);
}
mx[u]=max(mx[u],S-sz[u]);
if(mx[u]<maxn){
maxn=mx[u];
rt=u;
}
return;
}
void dfs(int u,int fa,int diss,int cnt){
if(cnt>k)
return;
int v,w;
s[++s[0]]=diss;sc[++sc[0]]=cnt;sav[++sav[0]]=cnt;
for(int i=hd[u];i;i=edg[i].nxt){
v=edg[i].v;w=edg[i].w;
if(v==fa||vis[v])
continue;
dfs(v,u,diss+w,cnt+1);
}
}
void devide(int u){
sav[0]=sc[0]=s[0]=0;maxn=n;vis[u]=1;
f[1]=0;g[1]=1;
int v,w,i,j;
for(i=hd[u];i;i=edg[i].nxt){
v=edg[i].v;w=edg[i].w;
if(vis[v])
continue;
s[0]=sc[0]=0;
dfs(v,u,w,1);
for(j=1;j<=s[0];j++)
if(sc[j]<=k){
if(f[k-sc[j]]+s[j]>ansmax){
ansmax=f[k-sc[j]]+s[j];
ans=g[k-sc[j]];
}
else if(f[k-sc[j]]+s[j]==ansmax){
ans+=g[k-sc[j]];
}
}
for(j=1;j<=s[0];j++)
if(sc[j]<=k){
if(s[j]>f[sc[j]+1]){
f[sc[j]+1]=s[j];
g[sc[j]+1]=1;
}
else if(s[j]==f[sc[j]+1])
g[sc[j]+1]++;
}
}
for(i=1;i<=sav[0];i++)
if(sav[i]<=k){
f[sav[i]+1]=f[N-1];
g[sav[i]+1]=0;
}
for(i=hd[u];i;i=edg[i].nxt){
v=edg[i].v;
if(vis[v])
continue;
S=sz[v];
getrt(v,0);
devide(rt);
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
int u,v,w,i;
for(i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dij();
dfs(1);
cntedge=ncnt;
memcpy(edg,e,sizeof(e));
memcpy(hd,nhd,sizeof(nhd));
memset(s,0,sizeof(s));
S=maxn=n;
memset(vis,0,sizeof(vis));
memset(f,-0x3f,sizeof(f));
getrt(1,0);
devide(rt);
printf("%d %d",ansmax,ans);
return 0;
}