#include <bits/stdc++.h>
using namespace std;
const int SIZE = 100;
const double eps = 1e-10;
const double EPS = 1e-8;
struct edge {
  int v;
  double c, f;
  int rev;
};
vector<edge> e[SIZE];
int used[SIZE];
int n, m, x;
int get_path(int pos, int cm, double w) {
  used[pos] = 1;
  if (pos == n - 1) return x;
  for (int i = 0; i < e[pos].size(); i++) {
    if (!used[e[pos][i].v] && e[pos][i].f + w < e[pos][i].c + EPS) {
      int cnt;
      if (w * x < e[pos][i].c + EPS - e[pos][i].f)
        cnt = x;
      else
        cnt = (int)((e[pos][i].c + EPS - e[pos][i].f) / w);
      cm = min(cm, cnt);
      if (cm < 0) cm = 0;
      int t = get_path(e[pos][i].v, cm, w);
      if (t) {
        int step = min(t, cm);
        e[pos][i].f += step * w;
        e[e[pos][i].v][e[pos][i].rev].f -= step * w;
        return step;
      }
    }
  }
  return 0;
}
int check(double w) {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < e[i].size(); j++) e[i][j].f = 0;
  int cnt = 0;
  for (;;) {
    for (int i = 0; i < n; i++) used[i] = 0;
    int t = get_path(0, x, w);
    if (t == 0) return 0;
    cnt += t;
    if (cnt >= x) return 1;
  }
}
int main() {
  int maxc;
  cin >> n >> m >> x;
  for (int i = 0; i < m; i++) {
    int u, v, c;
    cin >> u >> v >> c;
    u--;
    v--;
    edge t1, t2;
    t1.v = v;
    t2.v = u;
    t1.c = c;
    t2.c = 0;
    t1.f = t2.f = 0;
    e[u].push_back(t1);
    e[v].push_back(t2);
    e[u].back().rev = e[v].size() - 1;
    e[v].back().rev = e[u].size() - 1;
    maxc = max(maxc, c);
  }
  double l = 0, r = INT_MAX;
  for (int i = 0; i < 200; i++) {
    double m = (r + l) / 2;
    if (check(m))
      l = m;
    else
      r = m;
  }
  cout << fixed << setprecision(10) << l * x;
}
