#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using dd = double;
using pi = pair<int, int>;
using pl = pair<ll, ll>;
using pd = pair<dd, dd>;
using vi = vector<int>;
using vl = vector<ll>;
using vd = vector<dd>;
using vb = vector<bool>;
using vpi = vector<pi>;
using vpl = vector<pl>;
using vpd = vector<pd>;
template <class T, class V>
istream& operator>>(istream& in, pair<T, V>& pair) {
  return in >> pair.first >> pair.second;
}
template <class T>
istream& operator>>(istream& in, vector<T>& elements) {
  for (size_t i = 0; i < elements.size(); ++i) {
    in >> elements[i];
  }
  return in;
}
template <class Container, class Element>
bool Contains(const Container& container, const Element& element) {
  return container.find(element) != container.end();
}
template <class T>
ostream& operator<<(ostream& out, const vector<T>& elements) {
  for (const T& element : elements) {
    out << element << ' ';
  }
  return out;
}
template <class T, class V>
ostream& operator<<(ostream& out, const pair<T, V>& pair) {
  return out << pair.first << ' ' << pair.second;
}
int main() {
  ios_base::sync_with_stdio(false);
  using Graph = vector<unordered_map<int, ll>>;
  int n, m, k;
  cin >> n >> m >> k;
  Graph g(n);
  using WeightToEdge = pair<ll, pi>;
  priority_queue<WeightToEdge, vector<WeightToEdge>, greater<WeightToEdge>> q;
  for (size_t i = 0, i_len = (m); i < i_len; ++i) {
    int u, v;
    ll w;
    cin >> u >> v >> w;
    --u;
    --v;
    if (u > v) {
      swap(u, v);
    }
    g[u][v] = w;
    g[v][u] = w;
    q.push({w, {u, v}});
  }
  Graph hg(n);
  set<pi> used;
  while (k) {
    auto [w, vertexes] = q.top();
    q.pop();
    auto [u, v] = vertexes;
    assert(u < v);
    if (Contains(used, vertexes)) {
      continue;
    }
    --k;
    used.insert(vertexes);
    if (!k) {
      cout << w << endl;
      return 0;
    }
    hg[u][v] = w;
    hg[v][u] = w;
    for (const auto& [next, next_w] : hg[u]) {
      if (next == v) {
        continue;
      }
      q.push({w + next_w, {min(v, next), max(v, next)}});
    }
    for (const auto& [next, next_w] : hg[v]) {
      if (next == u) {
        continue;
      }
      q.push({w + next_w, {min(u, next), max(u, next)}});
    }
  }
  return 0;
}
