#include <bits/stdc++.h>
using namespace std;
int main() {
  int n, m, k;
  cin >> n >> m >> k;
  vector<pair<int, pair<int, int>>> dist;
  for (int i = 0; i < m; ++i) {
    int x, y, w;
    cin >> x >> y >> w;
    dist.push_back({w, {x, y}});
  }
  sort(dist.begin(), dist.end());
  vector<int> v;
  for (int i = 0; i < min(m, k); ++i) {
    v.push_back(dist[i].second.first);
    v.push_back(dist[i].second.second);
  }
  sort(v.begin(), v.end());
  v.resize(unique(v.begin(), v.end()) - v.begin());
  n = v.size();
  long long d[n][n];
  const long long MAX = 1e18 + 19;
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < n; ++j) {
      if (i == j) {
        d[i][i] = 0;
      } else {
        d[i][j] = MAX;
      }
    }
  }
  for (int i = 0; i < min(m, k); ++i) {
    auto p = dist[i];
    int x = lower_bound(v.begin(), v.end(), p.second.first) - v.begin();
    int y = lower_bound(v.begin(), v.end(), p.second.second) - v.begin();
    d[x][y] = d[y][x] = p.first;
  }
  for (int k = 0; k < n; ++k) {
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < n; ++j) {
        d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
      }
    }
  }
  vector<long long> paths;
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
      paths.push_back(d[i][j]);
    }
  }
  sort(paths.begin(), paths.end());
  cout << paths[k - 1];
  return 0;
}
