#include <bits/stdc++.h>
using namespace std;
struct Cell {
  long long int u, v, w;
};
Cell edge[200005];
unordered_map<long long int, long long int> mp;
long long int dp[805][805];
bool func(Cell &t1, Cell &t2) {
  if (t1.w < t2.w)
    return true;
  else
    return false;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  vector<long long int> vec;
  long long int n, m, k, i, f, j, r;
  cin >> n >> m >> k;
  for (i = 1; i <= m; i++) cin >> edge[i].u >> edge[i].v >> edge[i].w;
  sort(edge + 1, edge + m + 1, func);
  f = 0;
  for (i = 1; i <= min(k, m); i++) {
    if (mp.find(edge[i].u) == mp.end()) mp[edge[i].u] = ++f;
    if (mp.find(edge[i].v) == mp.end()) mp[edge[i].v] = ++f;
  }
  for (i = 1; i <= f; i++) {
    for (j = 1; j <= f; j++) dp[i][j] = 100000000000000;
  }
  for (i = 1; i <= min(k, m); i++)
    dp[mp[edge[i].u]][mp[edge[i].v]] = dp[mp[edge[i].v]][mp[edge[i].u]] =
        edge[i].w;
  for (i = 1; i <= f; i++) dp[i][i] = 0;
  for (r = 1; r <= f; r++) {
    for (i = 1; i <= f; i++) {
      for (j = 1; j <= f; j++) dp[i][j] = min(dp[i][j], dp[i][r] + dp[r][j]);
    }
  }
  for (i = 1; i <= f; i++) {
    for (j = i + 1; j <= f; j++) vec.push_back(dp[i][j]);
  }
  sort(vec.begin(), vec.end());
  cout << vec[k - 1] << "\n";
}
