#include <bits/stdc++.h>
#pragma optimization_level 3
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
long double TL = 1.0;
bool is_tl = 0;
long long CALLS = 0;
inline bool IS() {
  if (++CALLS == 1000) {
    CALLS = 0;
    is_tl |= clock() > (TL - 0.1) * CLOCKS_PER_SEC;
  }
  return is_tl;
}
template <typename T>
inline void amin(T &a, T b) {
  if (a > b) a = b;
}
template <typename T>
inline void amax(T &a, T b) {
  if (a < b) a = b;
}
template <typename T>
inline void print(T a) {
  for (auto U : a) cout << U << ' ';
  cout << '\n';
}
const long long N = 1e6 + 7, NS = 1e3 + 7, lg = 18, sq = 550, inf = 1e9 + 7,
                mod = 1e9 + 7, SM = 1e2 + 7;
const long double eps = 1e-9;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
struct edge {
  long long to;
  long long f;
  long long c;
  long long get() { return c - f; }
};
vector<edge> e;
vector<long long> v[N];
vector<pair<pair<long long, long long>, long long> > edges;
long long n, m, used[N];
void add_edge(long long a, long long b, long long c) {
  v[a].push_back(e.size());
  edge ed;
  ed.to = b;
  ed.f = 0;
  ed.c = c;
  e.push_back(ed);
  v[b].push_back(e.size());
  ed.to = a;
  ed.c = 0;
  e.push_back(ed);
}
long long dfs(long long x, long long f) {
  if (x == n - 1) return f;
  used[x] = 1;
  for (auto u : v[x]) {
    if (used[e[u].to] || e[u].get() <= 0) continue;
    long long y = dfs(e[u].to, min(f, e[u].get()));
    if (y) {
      e[u].f += y;
      e[u ^ 1].f -= y;
      return y;
    }
  }
  return 0;
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long need;
  cin >> n >> m >> need;
  for (long long i = 1; i <= m; i++) {
    long long a, b, c;
    cin >> a >> b >> c;
    a--, b--;
    edges.push_back({{a, b}, c});
  }
  long double l = 0, r = inf, mid;
  for (long long it = 0; it < 200; it++) {
    mid = (l + r) / 2;
    e.clear();
    for (long long i = 0; i < n; i++) v[i].clear();
    for (auto u : edges) {
      long long a = u.first.first, b = u.first.second,
                c = (long long)((u.second + 0.) / mid);
      add_edge(a, b, c);
    }
    long long ans = 0;
    while (1) {
      for (long long i = 0; i < n; i++) used[i] = 0;
      long long y = dfs(0, inf);
      if (!y) break;
      ans += y;
    }
    if (ans >= need)
      l = mid;
    else
      r = mid;
  }
  cout << fixed << setprecision(10);
  cout << mid * (0. + need);
}
