#include <bits/stdc++.h>
#pragma GCC optimize("-O2")
using namespace std;
void err(istream_iterator<string> it) { cerr << endl; }
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << "\t";
  err(++it, args...);
}
template <typename T1, typename T2>
ostream& operator<<(ostream& c, pair<T1, T2>& v) {
  c << "(" << v.first << "," << v.second << ")";
  return c;
}
template <template <class...> class TT, class... T>
ostream& operator<<(ostream& out, TT<T...>& c) {
  out << "{ ";
  for (auto& x : c) out << x << " ";
  out << "}";
  return out;
}
const long long int LIM = 50 + 5, MOD = 1e9 + 7;
const long double EPS = 1e-9;
long long int read() {
  long long int xx = 0, ff = 1;
  char ch = getchar();
  while (ch > '9' || ch < '0') {
    if (ch == '-') ff = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    xx = (xx << 3) + (xx << 1) + ch - '0';
    ch = getchar();
  }
  return xx * ff;
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
struct EdmondKarp {
  long long int n;
  vector<vector<long long int>> cap;
  vector<vector<long long int>> adj;
  EdmondKarp(long long int n) {
    this->n = n;
    cap.assign(n, vector<long long int>(n, 0));
    adj.assign(n, vector<long long int>(n, 0));
    for (long long int i = 0; i < n; i++) {
      for (long long int j = 0; j < n; j++) {
        adj[i][j] = j;
      }
    }
  }
  void addEdge(long long int u, long long int v, long long int w) {
    cap[u][v] = w;
  }
  long long int bfs(long long int s, long long int t,
                    vector<long long int>& parent) {
    fill(parent.begin(), parent.end(), -1);
    parent[s] = -2;
    queue<pair<long long int, long long int>> q;
    q.push({s, 2e18});
    while (!q.empty()) {
      long long int cur = q.front().first;
      long long int flow = q.front().second;
      q.pop();
      for (auto& nxt : adj[cur]) {
        if (parent[nxt] == -1 && cap[cur][nxt] > 0) {
          parent[nxt] = cur;
          long long int new_flow = min(flow, cap[cur][nxt]);
          if (nxt == t) {
            return new_flow;
          }
          q.push({nxt, new_flow});
        }
      }
    }
    return 0;
  }
  long long int maxflow(long long int s, long long int t) {
    long long int flow = 0;
    vector<long long int> parent(n);
    long long int new_flow;
    while (new_flow = bfs(s, t, parent)) {
      flow += new_flow;
      long long int cur = t;
      while (cur != s) {
        long long int prev = parent[cur];
        cap[prev][cur] -= new_flow;
        cap[cur][prev] += new_flow;
        cur = prev;
      }
    }
    return flow;
  }
};
vector<pair<long long int, long long int>> adj[LIM];
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  long long int n, m, x;
  cin >> n >> m >> x;
  for (long long int i = 0; i < m; ++i) {
    long long int a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    adj[a].push_back(make_pair(b, c));
  }
  long double l = 0, r = 1e9;
  for (long long int iter = 0; iter < 200; ++iter) {
    long double mid = (l + r) / 2;
    EdmondKarp f(n);
    assert(mid > 0);
    for (long long int i = 0; i < n; ++i) {
      for (auto& j : adj[i]) {
        f.addEdge(i, j.first, floor(((long double)j.second) / mid));
      }
    }
    long double ans = f.maxflow(0, n - 1);
    if (ans >= x) {
      l = mid;
    } else {
      r = mid;
    }
  }
  cout << setprecision(10) << fixed;
  cout << l * x << '\n';
  return 0;
}
