#include <bits/stdc++.h>
using namespace std;
long long int INF = 1e9;
struct edge {
  int x, y, cap, flow;
};
struct Dinics {
  vector<edge> e;
  vector<int> cur, d;
  vector<vector<int> > adj;
  int n, source, sink;
  Dinics() {}
  Dinics(int v) {
    n = v;
    cur = vector<int>(n + 1);
    d = vector<int>(n + 1);
    adj = vector<vector<int> >(n + 1);
  }
  void addEdge(int from, int to, int cap) {
    edge e1 = {from, to, cap, 0};
    edge e2 = {to, from, 0, 0};
    adj[from].push_back(e.size());
    e.push_back(e1);
    adj[to].push_back(e.size());
    e.push_back(e2);
  }
  int bfs() {
    queue<int> q;
    for (int i = 0; i <= n; ++i) d[i] = -1;
    q.push(source);
    d[source] = 0;
    while (!q.empty() and d[sink] < 0) {
      int x = q.front();
      q.pop();
      for (int i = 0; i < (int)adj[x].size(); ++i) {
        int id = adj[x][i], y = e[id].y;
        if (d[y] < 0 and e[id].flow < e[id].cap) {
          q.push(y);
          d[y] = d[x] + 1;
        }
      }
    }
    return d[sink] >= 0;
  }
  int dfs(int x, int flow) {
    if (!flow) return 0;
    if (x == sink) return flow;
    for (; cur[x] < (int)adj[x].size(); ++cur[x]) {
      int id = adj[x][cur[x]], y = e[id].y;
      if (d[y] != d[x] + 1) continue;
      int pushed = dfs(y, min(flow, e[id].cap - e[id].flow));
      if (pushed) {
        e[id].flow += pushed;
        e[id ^ 1].flow -= pushed;
        return pushed;
      }
    }
    return 0;
  }
  int maxFlow(int src, int snk) {
    this->source = src;
    this->sink = snk;
    int flow = 0;
    while (bfs()) {
      for (int i = 0; i <= n; ++i) cur[i] = 0;
      while (int pushed = dfs(source, INF)) {
        flow += pushed;
      }
    }
    return flow;
  }
};
vector<pair<int, pair<int, int> > > edges;
int n, m, x;
bool psbl(double k) {
  Dinics d(n + 2);
  for (int i = 0; i < m; i++) {
    int cst = edges[i].first;
    pair<int, int> tmp = edges[i].second;
    long long int f = (long long int)(cst / k);
    if (f > x) f = x;
    if (f > 0) d.addEdge(tmp.first, tmp.second, f);
  }
  int fl = d.maxFlow(1, n);
  if (fl >= x) return true;
  return false;
}
int main() {
  cin >> n >> m >> x;
  for (int i = 1; i <= m; i++) {
    int u, v, c;
    cin >> u >> v >> c;
    edges.push_back(make_pair(c, pair<int, int>(u, v)));
  }
  double l = 0, r = 1000000;
  for (int i = 1; i <= 100; i++) {
    double mid = (l + r) / 2;
    if (psbl(mid)) {
      l = mid;
    } else
      r = mid;
  }
  printf("%.10f\n", l * x);
}
