#include <bits/stdc++.h>
using namespace std;
const int MAX = 300;
int nodes, src, dst;
int dist[MAX], q[MAX], work[MAX];
struct Edge {
  int to, rev;
  long long f, cap;
  Edge(int to, int rev, long long f, long long cap)
      : to(to), rev(rev), f(f), cap(cap) {}
};
vector<Edge> G[MAX];
void addEdge(int s, int t, long long cap) {
  G[s].push_back(Edge(t, ((int)G[t].size()), 0, cap)),
      G[t].push_back(Edge(s, ((int)G[s].size()) - 1, 0, 0));
}
bool dinic_bfs() {
  fill(dist, dist + nodes, -1), dist[src] = 0;
  int qt = 0;
  q[qt++] = src;
  for (int qh = 0; qh < qt; qh++) {
    int u = q[qh];
    for (auto e = G[u].begin(); e != G[u].end(); ++e) {
      int v = e->to;
      if (dist[v] < 0 && e->f < e->cap) dist[v] = dist[u] + 1, q[qt++] = v;
    }
  }
  return dist[dst] >= 0;
}
long long dinic_dfs(int u, long long f) {
  if (u == dst) return f;
  for (int &i = work[u]; i < ((int)G[u].size()); i++) {
    Edge &e = G[u][i];
    if (e.cap <= e.f) continue;
    int v = e.to;
    if (dist[v] == dist[u] + 1) {
      long long df = dinic_dfs(v, min(f, e.cap - e.f));
      if (df > 0) {
        e.f += df, G[v][e.rev].f -= df;
        return df;
      }
    }
  }
  return 0;
}
long long maxFlow(int _src, int _dst) {
  src = _src, dst = _dst;
  long long result = 0;
  while (dinic_bfs()) {
    fill(work, work + nodes, 0);
    while (long long delta = dinic_dfs(src, 1e18)) result += delta;
  }
  return result;
}
int n, m, x;
pair<pair<int, int>, int> ee[512];
bool can(double w) {
  for (int i = 0, to = nodes; i < to; ++i) G[i].clear();
  for (int i = 0, to = m; i < to; ++i) {
    int x = ee[i].first.first;
    int y = ee[i].first.second;
    int c = ee[i].second;
    long long cc = (long long)min(c / w, 1e6);
    addEdge(x, y, cc);
  }
  return maxFlow(0, n - 1) >= x;
}
int main() {
  scanf("%d%d%d", &n, &m, &x);
  nodes = n;
  for (int i = 0, to = m; i < to; ++i) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    a--;
    b--;
    ee[i] = make_pair(make_pair(a, b), c);
  }
  double s = 0., e = 6e8;
  while (e - s > 1e-9 && s > 1e9 || (e - s) / s > 1e-9) {
    double m = (s + e) / 2;
    if (can(m))
      s = m;
    else
      e = m;
  }
  printf("%.12lf\n", s * x);
  return 0;
}
