#include <bits/stdc++.h>
const int MAXN = 57;
const int INF = 1e9;
long double e = 0.00000001;
using namespace std;
struct edge {
  long long flow, cap, to, rev;
  edge() {
    to = 0;
    flow = 0;
    cap = 0;
    rev = 0;
  }
  edge(long long too, long long revv, long long floww, long long capp) {
    to = too;
    flow = floww;
    cap = capp;
    rev = revv;
  }
};
vector<edge> G[MAXN];
void add(long long u, long long v, long long fl) {
  edge f = edge(v, G[v].size(), 0, fl);
  edge s = edge(u, G[u].size(), 0, 0);
  G[u].push_back(f);
  G[v].push_back(s);
}
long long dist[MAXN], po[MAXN];
queue<long long> C;
bool bfs(long long s, long long t) {
  for (long long i = 0; i < MAXN; i++) dist[i] = po[i] = 0;
  dist[s] = 1;
  C.push(s);
  while (C.size()) {
    long long u = C.front();
    C.pop();
    for (long long i = 0; i < G[u].size(); i++) {
      if (dist[G[u][i].to] == 0 && G[u][i].flow < G[u][i].cap) {
        dist[G[u][i].to] = dist[u] + 1;
        C.push(G[u][i].to);
      }
    }
  }
  return dist[t] != 0;
}
long long dfs(long long s, long long t, long long fl) {
  if (s == t) return fl;
  for (; po[s] < G[s].size(); po[s]++) {
    long long i = po[s];
    if (dist[G[s][i].to] == dist[s] + 1 && G[s][i].flow < G[s][i].cap) {
      long long temp = dfs(G[s][i].to, t, min(fl, G[s][i].cap - G[s][i].flow));
      G[s][i].flow += temp;
      G[G[s][i].to][G[s][i].rev].flow -= temp;
      if (temp > 0) return temp;
    }
  }
  return 0;
}
long long flow(long long s, long long t) {
  long long ans = 0, temp = 0;
  while (bfs(s, t))
    while (temp = dfs(s, t, INF)) ans += temp;
  return ans;
}
vector<pair<pair<int, int>, int>> v;
void mainp() {
  int n, m, x;
  cin >> n >> m >> x;
  while (m--) {
    int a, b, c;
    cin >> a >> b >> c;
    v.push_back({{a, b}, c});
  }
  long double l = 0, r = 10000000, ans = 0;
  for (int num = 0; num < 100; num++) {
    long double mid = (l + r) / 2.0;
    for (int i = 0; i < MAXN; i++) G[i].clear();
    for (int i = 0; i < v.size(); i++)
      add(v[i].first.first, v[i].first.second,
          (long long)v[i].second / (long double)mid);
    if (flow(1, n) >= x) {
      ans = mid;
      l = mid;
    } else
      r = mid;
  }
  cout << fixed << setprecision(9) << ans * x << endl;
}
int main() {
  mainp();
  return 0;
}
