#include <bits/stdc++.h>
using namespace std;
int n, m, x, tr[2 * 505], res;
bool dd[505];
struct edge {
  int u, v, c, f, a;
  edge(int _u = 0, int _v = 0, int _c = 0, int _f = 0, int _a = 0) {
    u = _u;
    v = _v;
    c = _c;
    f = _f;
    a = _a;
  }
} e[505 * 505];
vector<int> a[2 * 505];
void nhap() {
  cin >> n >> m >> x;
  int cnt = 0;
  for (int i = 1; i <= m; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    a[u].push_back(cnt);
    e[cnt++] = edge(u, v, w, 0, 0);
    a[v].push_back(cnt);
    e[cnt++] = edge(v, u, 0, 0, 0);
  }
}
bool BFS() {
  memset(tr, 0, sizeof tr);
  memset(dd, 0, sizeof dd);
  queue<int> q;
  q.push(1);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    if (u == n) return 1;
    for (int i = 0; i < a[u].size(); i++) {
      int id = a[u][i];
      int v = e[id].v;
      if (!tr[v] && e[id].a > e[id].f && !dd[v]) {
        tr[v] = id;
        dd[v] = 1;
        q.push(v);
      }
    }
  }
  return 0;
}
void tang() {
  int v = n, delta = INT_MAX;
  while (v != 1) {
    int id = tr[v];
    delta = min(delta, e[id].a - e[id].f);
    v = e[id].u;
  }
  v = n;
  while (v != 1) {
    int id = tr[v];
    e[id].f += delta;
    e[id ^ 1].f -= delta;
    v = e[id].u;
  }
  res += delta;
}
void solve() {
  double l = 1. / x, r = 1e6;
  int dem = 100;
  while (dem--) {
    double mid = (r + l) * 0.5;
    for (int i = 1; i <= n; i++)
      for (int j = 0; j < a[i].size(); j++) {
        int id = a[i][j];
        e[id].a = e[id].c / mid;
        e[id].f = 0;
      }
    res = 0;
    while (BFS()) tang();
    if (res >= x)
      l = mid;
    else
      r = mid;
  }
  printf("%.10lf\n", 1.0 * x * (l + r) / 2.0);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  nhap();
  solve();
  return 0;
}
