#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5;
struct Edge{
long long v,w;
};
vector<Edge>graph[MAXN];
struct Node{
long long dis,u;
bool operator >(const Node a)const{
return dis>a.dis;
}
};
priority_queue<Node,vector<Node>,greater<Node>>que;
priority_queue<long long>ans;
long long dis[MAXN];
bitset<MAXN>vis;
unordered_map<int,unordered_map<int,bool>>sher;
int n,m,k;
void dijstar(int start){
{priority_queue<Node,vector<Node>,greater<Node>>temp;swap(que,temp);}
for(int i=1;i<=n;i++){
dis[i]= LLONG_MAX;
vis[i]=false;
}
dis[start] = 0;
que.push({0,start});
while(!que.empty()){
int u = que.top().u;
que.pop();
if(vis[u])continue;
vis[u]=true;
for(auto i:graph[u]){
long long v = i.v,w=i.w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
que.push({dis[v], v});
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
graph[a].push_back(Edge{b,c});
graph[b].push_back(Edge{a,c});
}
for(int i=1;i<=n;i++){
dijstar(i);
for(int j=1;j<=n;j++){
if(i!=j && !sher[j][i]){
sher[i][j] = true;
ans.push(dis[j]);
}
}
while(ans.size()>k){
ans.pop();
}
}
printf("%lld",ans.top());
return 0;
}