#include "testlib.h" #include using namespace std; #include using namespace atcoder; using ll = long long; const int MAX_N = 200'000; const int MAX_M = 200'000; const ll MAX_K = 1'000'000'000'000'000'000LL; const ll INF = 1LL << 60; template bool chmin(T& a, U b) { return a > b ? a = b, 1 : 0; } int main(int argc, char* argv[]) { registerValidation(argc, argv); int N = inf.readInt(1, MAX_N, "N"); inf.readSpace(); int M = inf.readInt(1, MAX_M, "M"); inf.readSpace(); ll K = inf.readLong(1, MAX_K, "K"); inf.readEoln(); vector> E; for(int i = 0; i < M; i++) { int u = inf.readInt(1, N, "u_"+to_string(i)); inf.readSpace(); int v = inf.readInt(1, N, "v_"+to_string(i)); inf.readSpace(); ll t = inf.readLong(1, MAX_K, "t_"+to_string(i)); inf.readEoln(); u--; v--; E.emplace_back(t, u, v); } inf.readEof(); sort(E.begin(), E.end()); dsu UF(N); vector>> T(N); for(auto [c, a, b] : E) { if(UF.same(a, b)) continue; UF.merge(a, b); T[a].emplace_back(b, c); T[b].emplace_back(a, c); } vector dist(N); auto dfs = [&](auto&& self, int n, int p, ll d)->void { dist[n] = d; for(auto [e, c] : T[n]) if(e != p) self(self, e, n, (d + c)%K); }; dfs(dfs, 0, -1, 0); ll g = K; for(auto [c, a, b] : E) { g = gcd(g, ((dist[a] + dist[b])%K + c)%K); } cout << dist[N-1]%g << endl; }