Problem p02949 (C++)

Buggy submission (status: Runtime Error):
#include "bits/stdc++.h"
using namespace std;
#define Rep(i, n) for (int i = 0; i < (int)(n); i++)
#define For(i, n1, n2) for (int i = (int)(n1); i < (int)(n2); i++)
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define RREP(i, n) for (ll i = ((ll)(n)-1); i >= 0; i--)
#define FOR(i, n1, n2) for (ll i = (ll)(n1); i < (ll)(n2); i++)
#define RFOR(i, n1, n2) for (ll i = ((ll)(n1)-1); i >= (ll)(n2); i--)
#define all(a) (a).begin(), (a).end()
#define SORT(a) sort((a).begin(), (a).end())
#define oorret 0
#define oor(x)                                                                 \
  [&]() {                                                                      \
    try {                                                                      \
      x;                                                                       \
    } catch (const out_of_range &oor) {                                        \
      return oorret;                                                           \
    }                                                                          \
    return x;                                                                  \
  }()
#define IOS cin.tie(0), ios::sync_with_stdio(false)
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;
template <typename T1, typename T2> inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2> inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class Type> struct is_vector : std::false_type {};
template <class ValueType, class Alloc>
struct is_vector<std::vector<ValueType, Alloc>> : std::true_type {};
template <typename T>
inline ostream &operator<<(ostream &out, const vector<T> &v) {
  if (v.empty())
    return out;
  constexpr bool is_vector_v = is_vector<T>::value;
  if (is_vector_v)
    for (auto itr = v.begin(); itr != v.end();)
      out << (*itr), out << ((++itr != v.end()) ? "\n" : "");
  else
    for (auto itr = v.begin(); itr != v.end();)
      out << (*itr), out << ((++itr != v.end()) ? " " : "");
  return out;
}
inline void put() {}
template <class T> inline void put(const T &first) {
  std::cout << first << "\n";
}
template <class T, class... N>
inline void put(const T &first, const N &...rest) {
  std::cout << first << " ";
  put(rest...);
}
inline void putn() {}
template <class T, class... N>
inline void putn(const T &first, const N &...rest) {
  std::cout << first << "\n";
  putn(rest...);
}

struct edge {
  ll to, cost, index;
  edge(ll to, ll cost, ll index) : to(to), cost(cost), index(index) {}
};

void dfs(vector<vector<edge>> &path, vector<int> &st, int now) {
  REP(i, path[now].size()) {
    if (st[path[now][i].index] == 0) {
      st[path[now][i].index] = 1;
      dfs(path, st, path[now][i].to);
    }
  }
}

int main() {
  IOS;
  int n, m, p;
  cin >> n >> m >> p;
  vector<ll> a(m), b(m), c(m);
  vector<vector<edge>> path(n);
  vector<vector<edge>> path2(n);
  vector<vector<edge>> path3(n);
  vector<int> st(m, 0), dt(m, 0);
  REP(i, m) {
    cin >> a[i] >> b[i] >> c[i];
    a[i]--;
    b[i]--;
    path[a[i]].push_back(edge(b[i], c[i] - p, i));
    path2[b[i]].push_back(edge(a[i], c[i] - p, i));
  }
  vector<ll> dist(n, -1e15);
  int src = 0, dest = n - 1;
  dfs(path, st, src);
  dfs(path2, dt, dest);
  dist[src] = 0;
  REP(i, m) {
    if (st[i] && dt[i]) {
      path3[a[i]].push_back(edge(b[i], c[i] - p, i));
    }
  }
  REP(i, n * 2) {
    REP(j, n) {
      REP(k, path[j].size()) {
        if (chmax(dist[path3[j][k].to], dist[j] + path3[j][k].cost)) {
        }
      }
    }
  }
  REP(i, n) {
    REP(j, path3[i].size()) {
      if (dist[i] + path3[i][j].cost > dist[path3[i][j].to]) {
        put(-1);
        return 0;
      }
    }
  }
  put(max(dist[dest], 0ll));
  return 0;
}


Fixed submission:
#include "bits/stdc++.h"
using namespace std;
#define Rep(i, n) for (int i = 0; i < (int)(n); i++)
#define For(i, n1, n2) for (int i = (int)(n1); i < (int)(n2); i++)
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define RREP(i, n) for (ll i = ((ll)(n)-1); i >= 0; i--)
#define FOR(i, n1, n2) for (ll i = (ll)(n1); i < (ll)(n2); i++)
#define RFOR(i, n1, n2) for (ll i = ((ll)(n1)-1); i >= (ll)(n2); i--)
#define all(a) (a).begin(), (a).end()
#define SORT(a) sort((a).begin(), (a).end())
#define oorret 0
#define oor(x)                                                                 \
  [&]() {                                                                      \
    try {                                                                      \
      x;                                                                       \
    } catch (const out_of_range &oor) {                                        \
      return oorret;                                                           \
    }                                                                          \
    return x;                                                                  \
  }()
#define IOS cin.tie(0), ios::sync_with_stdio(false)
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;
template <typename T1, typename T2> inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2> inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class Type> struct is_vector : std::false_type {};
template <class ValueType, class Alloc>
struct is_vector<std::vector<ValueType, Alloc>> : std::true_type {};
template <typename T>
inline ostream &operator<<(ostream &out, const vector<T> &v) {
  if (v.empty())
    return out;
  constexpr bool is_vector_v = is_vector<T>::value;
  if (is_vector_v)
    for (auto itr = v.begin(); itr != v.end();)
      out << (*itr), out << ((++itr != v.end()) ? "\n" : "");
  else
    for (auto itr = v.begin(); itr != v.end();)
      out << (*itr), out << ((++itr != v.end()) ? " " : "");
  return out;
}
inline void put() {}
template <class T> inline void put(const T &first) {
  std::cout << first << "\n";
}
template <class T, class... N>
inline void put(const T &first, const N &...rest) {
  std::cout << first << " ";
  put(rest...);
}
inline void putn() {}
template <class T, class... N>
inline void putn(const T &first, const N &...rest) {
  std::cout << first << "\n";
  putn(rest...);
}

struct edge {
  ll to, cost, index;
  edge(ll to, ll cost, ll index) : to(to), cost(cost), index(index) {}
};

void dfs(vector<vector<edge>> &path, vector<int> &st, int now) {
  REP(i, path[now].size()) {
    if (st[path[now][i].index] == 0) {
      st[path[now][i].index] = 1;
      dfs(path, st, path[now][i].to);
    }
  }
}

int main() {
  IOS;
  int n, m, p;
  cin >> n >> m >> p;
  vector<ll> a(m), b(m), c(m);
  vector<vector<edge>> path(n);
  vector<vector<edge>> path2(n);
  vector<vector<edge>> path3(n);
  vector<int> st(m, 0), dt(m, 0);
  REP(i, m) {
    cin >> a[i] >> b[i] >> c[i];
    a[i]--;
    b[i]--;
    path[a[i]].push_back(edge(b[i], c[i] - p, i));
    path2[b[i]].push_back(edge(a[i], c[i] - p, i));
  }
  vector<ll> dist(n, -1e15);
  int src = 0, dest = n - 1;
  dfs(path, st, src);
  dfs(path2, dt, dest);
  dist[src] = 0;
  REP(i, m) {
    if (st[i] && dt[i]) {
      path3[a[i]].push_back(edge(b[i], c[i] - p, i));
    }
  }
  REP(i, n * 2) {
    REP(j, n) {
      REP(k, path3[j].size()) {
        if (chmax(dist[path3[j][k].to], dist[j] + path3[j][k].cost)) {
        }
      }
    }
  }
  REP(i, n) {
    REP(j, path3[i].size()) {
      if (dist[i] + path3[i][j].cost > dist[path3[i][j].to]) {
        put(-1);
        return 0;
      }
    }
  }
  put(max(dist[dest], 0ll));
  return 0;
}