int n, m, x; int u[kMaxN], v[kMaxN], w[kMaxN], col[kMaxN], st[kMaxN]; bool f[kMaxN][8]; std::vector<int> G[kMaxN];
int64_tlcm(int x, int y){ return1ll * x / std::__gcd(x, y) * y; }
voidbfs(){ std::queue<std::pair<int, int>> q; for (int i = 1; i <= n; ++i) for (int s = 0; s < 8; ++s) f[i][s] = 0; f[1][0] = 1, q.emplace(1, 0); for (; !q.empty();) { auto [u, s] = q.front(); q.pop(); for (auto i : G[u]) { int v = ::u[i] ^ ::v[i] ^ u, w = st[i], t = s ^ w; if (!f[v][t]) f[v][t] = 1, q.emplace(v, t); } } }
voiddickdreamer(){ std::cin >> n >> m >> x; for (int i = 1; i <= n; ++i) G[i].clear(); int g[3] = {0}; for (int i = 1; i <= m; ++i) { std::string str; std::cin >> u[i] >> v[i] >> w[i] >> str; if (str[0] == 'r') g[0] = std::__gcd(g[0], w[i]), col[i] = 0; elseif (str[0] == 'g') g[1] = std::__gcd(g[1], w[i]), col[i] = 1; else g[2] = std::__gcd(g[2], w[i]), col[i] = 2; G[u[i]].emplace_back(i), G[v[i]].emplace_back(i); } g[0] *= 2, g[1] *= 2, g[2] *= 2; for (int i = 1; i <= m; ++i) { if (w[i] % g[col[i]] == 0) st[i] = 0; else st[i] = (1 << col[i]); } bfs(); int ans = 1e9; int MM[3] = {std::__gcd<int64_t>(g[0], lcm(g[1], g[2])), std::__gcd<int64_t>(g[1], lcm(g[0], g[2])), std::__gcd<int64_t>(g[2], lcm(g[0], g[1]))}; int LCM = lcm(MM[0], lcm(MM[1], MM[2])); for (int s = 0; s < 8; ++s) { if (!f[n][s]) continue; int M[3] = {MM[0], MM[1], MM[2]}; int R[3] = {(s & 1) * g[0] / 2 % M[0], (s >> 1 & 1) * g[1] / 2 % M[1], (s >> 2 & 1) * g[2] / 2 % M[2]}; if (M[1] > std::max(M[0], M[2])) std::swap(M[0], M[1]), std::swap(R[0], R[1]); elseif (M[2] > std::max(M[0], M[1])) std::swap(M[0], M[2]), std::swap(R[0], R[2]); for (int i = R[0]; i <= LCM + R[0]; i += M[0]) { if (i < R[1] || i < R[2]) continue; int id[2][2] = {{(i - R[1]) / M[1] * M[1] + R[1], (i - R[1]) / M[1] * M[1] + M[1] + R[1]}, {(i - R[2]) / M[2] * M[2] + R[2], (i - R[2]) / M[2] * M[2] + M[2] + R[2]}}; for (int o1 = 0; o1 < 2; ++o1) for (int o2 = 0; o2 < 2; ++o2) ans = std::min(ans, std::max({i, id[0][o1], id[1][o2]}) - std::min({i, id[0][o1], id[1][o2]})); } } std::cout << ans << '\n'; }