#include <bits/stdc++.h>
using namespace std;
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
int dddx[] = {1, -1, 0, 0, 1, 1, -1, -1};
int dddy[] = {0, 0, 1, -1, 1, -1, 1, -1};
int n, m, k;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n >> m >> k;
  vector<pair<long long int, pair<int, int> > > edges;
  for (int i = 0; i < m; i++) {
    int a, b, c;
    cin >> a >> b >> c;
    edges.push_back({c, {a, b}});
  }
  sort(edges.begin(), edges.end());
  set<int> aux;
  vector<int> vert;
  for (int i = 0; i < min(m, k); i++) {
    aux.insert(edges[i].second.second);
    aux.insert(edges[i].second.first);
  }
  for (auto i : aux) vert.push_back(i);
  sort(vert.begin(), vert.end());
  long long int vec[1000][1000];
  for (int i = 0; i < 1000; i++)
    for (int j = 0; j < 1000; j++) vec[i][j] = 1e15;
  for (int i = 0; i < 1000; i++) vec[i][i] = 0;
  for (int i = 0; i < min(m, k); i++) {
    int x = lower_bound(vert.begin(), vert.end(), edges[i].second.first) -
            vert.begin();
    int y = lower_bound(vert.begin(), vert.end(), edges[i].second.second) -
            vert.begin();
    vec[x][y] = vec[y][x] = min(vec[x][y], edges[i].first);
  }
  for (int kk = 0; kk < int(vert.size()); kk++) {
    for (int i = 0; i < int(vert.size()); i++) {
      for (int j = 0; j < int(vert.size()); j++) {
        vec[i][j] = min(vec[i][j], vec[kk][i] + vec[j][kk]);
      }
    }
  }
  vector<long long int> ans;
  for (int i = 0; i < int(vert.size()); i++) {
    for (int j = i + 1; j < int(vert.size()); j++) {
      ans.push_back(vec[i][j]);
    }
  }
  sort(ans.begin(), ans.end());
  cout << ans[k - 1] << "\n";
  return 0;
}
