#include <bits/stdc++.h>
using namespace std;
template <typename T>
vector<T> readVector(int n) {
  vector<T> res(n);
  for (int i = 0; i < n; i++) cin >> res[i];
  return res;
}
template <typename T>
void printVector(vector<T> in) {
  int n = in.size();
  for (int i = 0; i < n; i++) {
    cout << in[i] << " \n"[i == n - 1];
  }
}
const long long int mod = 1e9 + 7;
long long int from[60];
long long int source, sink, n;
long long int capacity[60][60];
vector<int> adj[60];
bool vis[60];
long long int bfs() {
  queue<long long int> Q;
  Q.push(source);
  for (long long int i = 0; i <= n; i++) {
    vis[i] = 0;
    from[i] = -1;
  }
  vis[source] = 1;
  long long int where, prev;
  bool flag = 0;
  while (!Q.empty()) {
    where = Q.front();
    Q.pop();
    for (auto i : adj[where]) {
      if (!vis[i] and capacity[where][i] > 0) {
        Q.push(i);
        vis[i] = 1;
        from[i] = where;
        if (i == sink) {
          flag = 1;
          break;
        }
      }
    }
    if (flag) break;
  }
  if (!flag) return 0;
  long long int path_cap = 1e9 + 10;
  for (where = sink; where != source; where = from[where]) {
    prev = from[where];
    path_cap = min(path_cap, capacity[prev][where]);
  }
  for (where = sink; where != source; where = from[where]) {
    prev = from[where];
    capacity[prev][where] -= path_cap;
    capacity[where][prev] += path_cap;
  }
  if (path_cap == 1e9 + 10)
    return 0;
  else
    return path_cap;
}
long long int ford_fulkerson() {
  long long int maxflow = 0;
  while (1) {
    long long int ret = bfs();
    if (ret == 0) break;
    maxflow += ret;
  }
  return maxflow;
}
vector<pair<int, int> > vct;
long long int x;
long long int init[60][60];
bool check(long double t) {
  for (int i = 0; i <= n; i++)
    for (int j = 0; j <= n; j++) {
      long double tp = (init[i][j] / t + 1e-7);
      if (tp > 1e9) tp = 1e7;
      capacity[i][j] = tp;
    }
  long long int mz = ford_fulkerson();
  if (mz >= x) return true;
  return false;
}
int main() {
  int m;
  cin >> n >> m >> x;
  source = 1;
  sink = n;
  for (int i = 0, x, y, z; i < m; i++) {
    scanf("%d%d%d", &x, &y, &z);
    adj[x].push_back(y);
    vct.push_back({x, y});
    init[x][y] = z;
  }
  long double hi = 10000000, lo = 1.0 / x, md;
  for (int i = 0; i < 100; i++) {
    md = (lo + hi) / 2;
    if (check(md)) {
      lo = md;
    } else {
      hi = md;
    }
  }
  cout << fixed << setprecision(10) << lo * x << endl;
}
