#include <bits/stdc++.h>
using namespace std;
void read(int &k) {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  k = x * f;
}
int n, m, k, nn = 1, S, T;
int p[505], h[505], a[505], b[505], w[505];
double l, r, ans;
struct edge {
  int a, b, nt, w;
} e[505 * 2];
void anode(int x, int y, int z) {
  nn++;
  e[nn].a = x;
  e[nn].b = y;
  e[nn].w = z;
  e[nn].nt = p[x];
  p[x] = nn;
}
void addedge(int x, int y, int z) { anode(x, y, z), anode(y, x, 0); }
bool bfs() {
  memset(h, -1, sizeof(h));
  queue<int> q;
  q.push(S);
  h[S] = 0;
  while (!q.empty()) {
    int k = q.front();
    q.pop();
    for (int i = p[k]; i; i = e[i].nt) {
      int v = e[i].b;
      if (h[v] == -1 && e[i].w) {
        h[v] = h[k] + 1;
        q.push(v);
      }
    }
  }
  return h[T] != -1;
}
int dfs(int pos, int f) {
  if (pos == T || !f) return f;
  int used = 0, w = 0;
  for (int i = p[pos]; i; i = e[i].nt) {
    if (h[e[i].b] == h[pos] + 1 && e[i].w) {
      w = dfs(e[i].b, min(e[i].w, f - used));
      used += w;
      e[i].w -= w;
      e[i ^ 1].w += w;
      if (f == used) return f;
    }
  }
  return used;
}
int dinic() {
  int sum = 0;
  while (bfs()) sum += dfs(S, 2000000000);
  return sum;
}
bool check(double mid) {
  memset(p, 0, sizeof(p));
  memset(e, 0, sizeof(e)), nn = 1;
  for (int i = 1; i <= m; i++)
    addedge(a[i], b[i], (int)min(k * 1.0, (w[i] * 1.0 / mid)));
  return dinic() >= k;
}
int main() {
  read(n), read(m), read(k);
  S = 1, T = n;
  for (int i = 1; i <= m; i++) read(a[i]), read(b[i]), read(w[i]);
  l = 0, r = 10000000000;
  for (int i = 0; i <= 100; i++) {
    double mid = (l + r) / 2;
    if (check(mid)) {
      ans = mid;
      l = mid;
    } else
      r = mid;
  }
  printf("%.10f\n", ans * k);
  return 0;
}
