#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e5 + 5;
const int MOD = 1e9 + 7;
template<typename T>
void maximize(T& a, const T& b) {
if (a < b) a = b;
}
template<typename T>
void minimize(T& a, const T& b) {
if (b < a) a = b;
}
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
}
int n, m;
vector<ii> adj[N];
struct Node {
int u; ll d;
bool operator<(const Node& other) const {
return d > other.d;
}
};
ll dist[N]; // dist[u] = Đường đi ngắn nhất từ s đến u
int cnt[N]; // cnt[u] = Số đường đi ngắn nhất từ s đến u
int mx[N]; // mx[u] = Số đỉnh trên đường đi ngắn nhất từ s đến u mà đi qua nhiều đỉnh nhất
int mn[N]; // mn[u] = Số đỉnh trên đường đi ngắn nhất từ s đến u mà đi qua ít đỉnh nhất
void dijkstra(int s) {
for (int u = 1; u <= n; u++) {
dist[u] = LINF;
cnt[u] = 0;
mx[u] = 0;
mn[u] = INF;
}
priority_queue<Node> pq;
dist[s] = 0;
cnt[s] = 1;
mx[s] = mn[s] = 0;
pq.push({s, dist[s]});
while (!pq.empty()) {
Node front = pq.top(); pq.pop();
int u = front.u; ll d = front.d;
if (d > dist[u]) continue;
for (ii v : adj[u]) {
if (dist[u] + v.second < dist[v.first]) {
dist[v.first] = dist[u] + v.second;
cnt[v.first] = cnt[u];
mx[v.first] = mx[u] + 1;
mn[v.first] = mn[u] + 1;
pq.push({v.first, dist[v.first]});
}
else if (dist[u] + v.second == dist[v.first]) {
add(cnt[v.first], cnt[u]);
maximize(mx[v.first], mx[u] + 1);
minimize(mn[v.first], mn[u] + 1);
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v, w});
}
dijkstra(1);
cout << dist[n] << ' ' << cnt[n] << ' ' << mn[n] << ' ' << mx[n] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTUgKyA1OyAKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7ICAKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgbWF4aW1pemUoVCYgYSwgY29uc3QgVCYgYikgewoJaWYgKGEgPCBiKSBhID0gYjsgIAp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIG1pbmltaXplKFQmIGEsIGNvbnN0IFQmIGIpIHsKCWlmIChiIDwgYSkgYSA9IGI7IAp9Cgp2b2lkIGFkZChpbnQmIGEsIGludCBiKSB7CglhICs9IGI7IAoJaWYgKGEgPj0gTU9EKSBhIC09IE1PRDsgCn0KCmludCBuLCBtOyAgCnZlY3RvcjxpaT4gYWRqW05dOyAKCnN0cnVjdCBOb2RlIHsKCWludCB1OyBsbCBkOyAgCglib29sIG9wZXJhdG9yPChjb25zdCBOb2RlJiBvdGhlcikgY29uc3QgewoJCXJldHVybiBkID4gb3RoZXIuZDsgCgl9Cn07IAoKbGwgZGlzdFtOXTsgLy8gZGlzdFt1XSA9IMSQxrDhu51uZyDEkWkgbmfhuq9uIG5o4bqldCB04burIHMgxJHhur9uIHUKaW50IGNudFtOXTsgLy8gY250W3VdID0gU+G7kSDEkcaw4budbmcgxJFpIG5n4bqvbiBuaOG6pXQgdOG7qyBzIMSR4bq/biB1CmludCBteFtOXTsgLy8gbXhbdV0gPSBT4buRIMSR4buJbmggdHLDqm4gxJHGsOG7nW5nIMSRaSBuZ+G6r24gbmjhuqV0IHThu6sgcyDEkeG6v24gdSBtw6AgxJFpIHF1YSBuaGnhu4F1IMSR4buJbmggbmjhuqV0CmludCBtbltOXTsgLy8gbW5bdV0gPSBT4buRIMSR4buJbmggdHLDqm4gxJHGsOG7nW5nIMSRaSBuZ+G6r24gbmjhuqV0IHThu6sgcyDEkeG6v24gdSBtw6AgxJFpIHF1YSDDrXQgxJHhu4luaCBuaOG6pXQKCnZvaWQgZGlqa3N0cmEoaW50IHMpIHsKCWZvciAoaW50IHUgPSAxOyB1IDw9IG47IHUrKykgewoJCWRpc3RbdV0gPSBMSU5GOyAKCQljbnRbdV0gPSAwOyAgCgkJbXhbdV0gPSAwOyAKCQltblt1XSA9IElORjsgCgl9CgoJcHJpb3JpdHlfcXVldWU8Tm9kZT4gcHE7ICAKCWRpc3Rbc10gPSAwOyAgCgljbnRbc10gPSAxOyAgIAoJbXhbc10gPSBtbltzXSA9IDA7ICAKCXBxLnB1c2goe3MsIGRpc3Rbc119KTsgIAoKCXdoaWxlICghcHEuZW1wdHkoKSkgewoJCU5vZGUgZnJvbnQgPSBwcS50b3AoKTsgcHEucG9wKCk7ICAKCQlpbnQgdSA9IGZyb250LnU7IGxsIGQgPSBmcm9udC5kOyAgCgoJCWlmIChkID4gZGlzdFt1XSkgY29udGludWU7ICAKCgkJZm9yIChpaSB2IDogYWRqW3VdKSB7CgkJCWlmIChkaXN0W3VdICsgdi5zZWNvbmQgPCBkaXN0W3YuZmlyc3RdKSB7CgkJCQlkaXN0W3YuZmlyc3RdID0gZGlzdFt1XSArIHYuc2Vjb25kOyAgCgkJCQljbnRbdi5maXJzdF0gPSBjbnRbdV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCQkJCW14W3YuZmlyc3RdID0gbXhbdV0gKyAxOyAgCgkJCQltblt2LmZpcnN0XSA9IG1uW3VdICsgMTsgCgkJCQlwcS5wdXNoKHt2LmZpcnN0LCBkaXN0W3YuZmlyc3RdfSk7ICAKCQkJfQoJCQllbHNlIGlmIChkaXN0W3VdICsgdi5zZWNvbmQgPT0gZGlzdFt2LmZpcnN0XSkgewoJCQkJYWRkKGNudFt2LmZpcnN0XSwgY250W3VdKTsgIAoJCQkJbWF4aW1pemUobXhbdi5maXJzdF0sIG14W3VdICsgMSk7IAoJCQkJbWluaW1pemUobW5bdi5maXJzdF0sIG1uW3VdICsgMSk7ICAKCQkJfQoJCX0KCX0KfQoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IG4gPj4gbTsgCgoJZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKCQlpbnQgdSwgdiwgdzsgCgkJY2luID4+IHUgPj4gdiA+PiB3OyAKCQlhZGpbdV0ucHVzaF9iYWNrKHt2LCB3fSk7IAoJfQoKCWRpamtzdHJhKDEpOyAKCgljb3V0IDw8IGRpc3Rbbl0gPDwgJyAnIDw8IGNudFtuXSA8PCAnICcgPDwgbW5bbl0gPDwgJyAnIDw8IG14W25dIDw8ICdcbic7IAp9