#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:640000000")
using namespace std;
inline void read(int &);
inline void read(long long &);
inline void read(double &);
inline void read(char &);
inline void read(string &);
template <typename T1, typename T2>
inline void read(T1 &, T2 &);
template <typename T1, typename T2, typename T3>
inline void read(T1 &, T2 &, T3 &);
template <typename T1, typename T2, typename T3, typename T4>
inline void read(T1 &, T2 &, T3 &, T4 &);
inline void read(string &s) {
  static char buf[int(1e6) + 10];
  assert(scanf("%s", buf) == 1);
  s = string(buf);
  return;
}
const int INF = (int)(1e9);
const long long INF64 = (long long)(INF) * (long long)(INF);
const double eps = 1e-8;
const double pi = double(3.1415926535897932384626433832795);
inline bool in(int i, int j, int n, int m) {
  return i >= 1 && i <= n && j >= 1 && j <= m;
}
inline int myrand() { return (rand() ^ (rand() << 15)); }
inline long long randL() { return myrand() * 1LL * myrand() + myrand(); }
const int dx[] = {0, -1, 1, 0};
const int dy[] = {-1, 0, 0, 1};
const int N = 55;
int c[N][N], f[N][N];
int n, m, first;
int g[N][N];
inline void gen() { return; }
inline bool read() {
  if (!(cin >> n >> m >> first)) return false;
  for (int i = 0; i < (int)(m); i++) {
    int u, v, w;
    assert(cin >> u >> v >> w);
    u--, v--;
    g[u][v] = w;
  }
  return true;
}
bool used[N];
int from[N];
int mn[N];
int F = 0;
bool enlarge(int s, int t) {
  queue<int> q;
  for (int i = 0; i < (int)(N); i++) used[i] = false, from[i] = -1, mn[i] = INF;
  q.push(s);
  used[s] = true;
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    for (int i = 0; i < (int)(n); i++)
      if (c[v][i] - f[v][i] > 0 && !used[i]) {
        q.push(i);
        used[i] = true;
        mn[i] = min(mn[v], c[v][i] - f[v][i]);
        from[i] = v;
      }
  }
  int curFlow = mn[t];
  if (curFlow == INF) return false;
  F += curFlow;
  int v = t;
  while (from[v] != -1) {
    int i = from[v], j = v;
    f[i][j] += curFlow;
    f[j][i] -= curFlow;
    v = from[v];
  }
  return true;
}
bool can() {
  F = 0;
  while (enlarge(0, n - 1) && F < first)
    ;
  return F >= first;
}
inline void solve() {
  double lf = 0, rg = INF;
  const int IT = 100;
  for (int it = 0; it < (int)(IT); it++) {
    double mid = (lf + rg) * 0.5;
    for (int i = 0; i < (int)(N); i++)
      for (int j = 0; j < (int)(N); j++) c[i][j] = 0;
    for (int i = 0; i < (int)(n); i++)
      for (int j = 0; j < (int)(n); j++)
        if (g[i][j])
          c[i][j] = int(min(double(INF - 1), (double(g[i][j]) / mid + eps)));
    for (int i = 0; i < (int)(N); i++)
      for (int j = 0; j < (int)(N); j++) f[i][j] = 0;
    if (can())
      lf = mid;
    else
      rg = mid;
  }
  cout << lf * first << endl;
  return;
}
int main() {
  cout << setprecision(10) << fixed;
  cerr << setprecision(10) << fixed;
  srand(int(time(NULL)));
  int T = 1;
  for (int i = 0; i < (int)(T); i++) {
    assert(read());
    solve();
  }
  return 0;
}
