#include <bits/stdc++.h>
using namespace std;
const int INF = int(1e9);
const long long INFll = 1ll * INF * INF;
const long double ldINF = 1e+018;
const long double EPS = 0.00000000000001;
template <typename T>
ostream& operator<<(ostream& out, pair<T, T>& a) {
  out << a.first << " " << a.second;
  return out;
}
template <typename T>
istream& operator>>(istream& in, pair<T, T>& a) {
  in >> a.first >> a.second;
  return in;
}
template <typename T>
istream& operator>>(istream& in, vector<T>& a) {
  for (int i = 0; i < a.size(); ++i) in >> a[i];
  return in;
}
template <typename T>
ostream& operator<<(ostream& out, vector<T> a) {
  for (int i = 0; i < a.size(); ++i)
    if (i == a.size() - 1)
      out << a[i];
    else
      out << a[i] << " ";
  return out;
}
struct edge {
  int to;
  long long cap, flow;
  int back;
};
vector<edge> g[60];
vector<edge> f[60];
int d[60];
int ptr[60];
void add_edge(int u, int v, long long cap) {
  edge e1 = {v, cap, 0, int(g[v].size())};
  edge e2 = {u, 0, 0, int(g[u].size())};
  g[u].push_back(e1);
  g[v].push_back(e2);
}
int n, m, x;
bool bfs() {
  for (int i = 0; i < n; i++) d[i] = -1;
  queue<int> q;
  d[0] = 0;
  q.push(0);
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    for (int i = 0; i < g[v].size(); i++) {
      int to = g[v][i].to;
      if (g[v][i].flow < g[v][i].cap && d[to] == -1) {
        d[to] = d[v] + 1;
        q.push(to);
      }
    }
  }
  return d[n - 1] != -1;
}
long double dfs(int v, long long fl) {
  if (v == n - 1 || fl == 0) return fl;
  for (int i = ptr[v]; i < g[v].size(); i++) {
    int to = g[v][i].to;
    if (d[to] == d[v] + 1) {
      long long pushed = dfs(to, min(fl, g[v][i].cap - g[v][i].flow));
      if (pushed > 0) {
        g[v][i].flow += pushed;
        g[to][g[v][i].back].flow -= pushed;
        return pushed;
      }
    }
    ptr[v]++;
  }
  return 0;
}
bool check(long double t) {
  long long flow = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < g[i].size(); j++)
      g[i][j].cap = floor(1.0 * g[i][j].cap / t);
  while (bfs()) {
    for (int i = 0; i < n; i++) ptr[i] = 0;
    while (true) {
      long long pushed = dfs(0, INF);
      if (!pushed) break;
      flow += pushed;
    }
  }
  for (int i = 0; i < n; i++) g[i] = f[i];
  return (flow >= x);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m >> x;
  for (int i = 0; i < m; i++) {
    int a, b, c;
    cin >> a >> b >> c;
    a--, b--;
    add_edge(a, b, c);
  }
  for (int i = 0; i < n; i++) f[i] = g[i];
  long double l = 1e-8, r = ldINF;
  long double res = 0;
  for (int it = 0; it < 150; it++) {
    long double mid = (l + r) / 2;
    if (check(mid))
      l = mid, res = mid;
    else
      r = mid;
  }
  cout << fixed << setprecision(10);
  cout << res * x << endl;
  if (0)
    cerr << fixed << setprecision(0)
         << "TIME = " << clock() / (long double)CLOCKS_PER_SEC * 1000 << "\n";
  return 0;
}
