#include<cstdio> #include<cmath> using ll = longlong; inline ll read(){ ll S = 0, C = 0; char Y = getchar(); while (Y > 57 || Y < 48) C |= Y == 45, Y = getchar(); while (Y <= 57 && Y >= 48) S = (S << 3) + (S << 1) + Y - 48, Y = getchar(); return C ? -S : S; }
voidunit(){ for (int i = 0; i < n; ++i) { a[i][i] = 1; } }
Matrix operator + (Matrix b) { Matrix res(n); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { res.a[i][j] = a[i][j] + b.a[i][j]; } } return res; }
Matrix operator * (Matrix b) { Matrix res(n); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { for (int k = 0; k < n; ++k) { res.a[i][j] += a[i][k] * b.a[k][j]; } } } return res; }
Matrix operator ^ (ll d) { Matrix M(n); M.unit(); for (int bit = 60; bit >= 0; --bit) { M = M * M; if (d & (1ll << bit)) { M = M * *this; } } return M; }
Matrix operator >> (ll d) { Matrix M(n), res(n); M.unit(); for (int bit = 60; bit >= 0; --bit) { res = res * M + res; M = M * M; if (d & (1ll << bit)) { M = M * *this; res = res + M; } } return res; } };
voideachT(){ int n, m; cin >> n >> m;
ll L, R; cin >> L >> R; L--, R--; // 0-index
Matrix E(n), M(n); while (m--) { int x, y, w; cin >> x >> y >> w; x--, y--; if (y < n) E.a[x][y] = w; else M.a[x][y - n] = w; }
// 初始值 vector<Z> f(n); f[0] = 1; for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { f[y] += f[x] * E.a[x][y]; } }
// 广义 Floyd for (int k = 0; k < n; ++k) { for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { M.a[x][y] += M.a[x][k] * E.a[k][y]; } } }
ll Lq = L / n, Lr = L % n; ll Rq = R / n, Rr = R % n;
Z ans = 0; if (Lq < Rq) { Matrix MM = M ^ Lq; vector<Z> g(n); for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { g[y] += f[x] * MM.a[x][y]; } }
// from Lq*(n-1)+Lr to Lq*n for (int y = Lr; y < n; ++y) { ans += g[y]; }
// from Lq*n to Rq*n MM = M >> (Rq - Lq - 1); for (int x = 0; x < n; ++x) { for (int y = 0; y < n; ++y) { ans += g[x] * MM.a[x][y]; } }
// from Rq*n to Rq*n+Rr MM = M ^ Rq; for (int x = 0; x < n; ++x) { for (int y = 0; y <= Rr; ++y) { ans += f[x] * MM.a[x][y]; } } } else { Matrix MM = M ^ Lq; for (int x = 0; x < n; ++x) { for (int y = Lr; y <= Rr; ++y) { ans += f[x] * MM.a[x][y]; } } }