#include <bits/stdc++.h>
#define int long long
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 + 9277; // nên chọn MOD lạ một chút, những MOD như 1e9 + 7, 1e9 + 9 quá phổ biến
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
}
int n, m;
vector<ii> adj[N], radj[N];
struct Node {
int u; ll d;
bool operator<(const Node& other) const {
return d > other.d;
}
};
ll dist_1[N]; // dist_1[u] = Đường đi ngắn nhất từ 1 đến u
ll dist_n[N]; // dist_n[u] = Đường đi ngắn nhất u đến n
int cnt_1[N]; // cnt_1[u] = Số đường đi ngắn nhất từ 1 đến u
int cnt_n[N]; // cnt_n[u] = Số đường đi ngắn nhất từ u đến n
void dijkstra(int s, vector<ii> adj[], ll dist[], int cnt[]) {
for (int u = 1; u <= n; u++) {
dist[u] = LINF;
cnt[u] = 0;
}
priority_queue<Node> pq;
dist[s] = 0;
cnt[s] = 1;
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];
pq.push({v.first, dist[v.first]});
}
else if (dist[u] + v.second == dist[v.first]) {
add(cnt[v.first], cnt[u]);
}
}
}
}
signed 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});
radj[v].push_back({u, w});
}
dijkstra(1, adj, dist_1, cnt_1);
dijkstra(n, radj, dist_n, cnt_n);
vector<int> ans;
for (int u = 1; u <= n; u++) {
// Điều kiện để đỉnh u nằm trên MỌI đường đi ngắn nhất từ 1 đến n
if (dist_1[u] + dist_n[u] == dist_1[n] && 1ll * cnt_1[u] * cnt_n[u] % MOD == cnt_1[n]) {
ans.push_back(u);
}
}
cout << ans.size() << '\n';
for (int u : ans) cout << u << ' ';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKI2RlZmluZSBpbnQgbG9uZyBsb25nIAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTUgKyA1OyAKY29uc3QgaW50IE1PRCA9IDFlOSArIDkyNzc7IC8vIG7Dqm4gY2jhu41uIE1PRCBs4bqhIG3hu5l0IGNow7p0LCBuaOG7r25nIE1PRCBuaMawIDFlOSArIDcsIDFlOSArIDkgcXXDoSBwaOG7lSBiaeG6v24KCnZvaWQgYWRkKGludCYgYSwgaW50IGIpIHsKCWEgKz0gYjsgCglpZiAoYSA+PSBNT0QpIGEgLT0gTU9EOyAKfQoKaW50IG4sIG07ICAKdmVjdG9yPGlpPiBhZGpbTl0sIHJhZGpbTl07IAoKc3RydWN0IE5vZGUgewoJaW50IHU7IGxsIGQ7ICAKCWJvb2wgb3BlcmF0b3I8KGNvbnN0IE5vZGUmIG90aGVyKSBjb25zdCB7CgkJcmV0dXJuIGQgPiBvdGhlci5kOyAKCX0KfTsgCgpsbCBkaXN0XzFbTl07IC8vIGRpc3RfMVt1XSA9IMSQxrDhu51uZyDEkWkgbmfhuq9uIG5o4bqldCB04burIDEgxJHhur9uIHUgCmxsIGRpc3RfbltOXTsgLy8gZGlzdF9uW3VdID0gxJDGsOG7nW5nIMSRaSBuZ+G6r24gbmjhuqV0IHUgxJHhur9uIG4KaW50IGNudF8xW05dOyAvLyBjbnRfMVt1XSA9IFPhu5EgxJHGsOG7nW5nIMSRaSBuZ+G6r24gbmjhuqV0IHThu6sgMSDEkeG6v24gdSAKaW50IGNudF9uW05dOyAvLyBjbnRfblt1XSA9IFPhu5EgxJHGsOG7nW5nIMSRaSBuZ+G6r24gbmjhuqV0IHThu6sgdSDEkeG6v24gbgoKdm9pZCBkaWprc3RyYShpbnQgcywgdmVjdG9yPGlpPiBhZGpbXSwgbGwgZGlzdFtdLCBpbnQgY250W10pIHsKCWZvciAoaW50IHUgPSAxOyB1IDw9IG47IHUrKykgewoJCWRpc3RbdV0gPSBMSU5GOyAKCQljbnRbdV0gPSAwOyAgCgl9CgoJcHJpb3JpdHlfcXVldWU8Tm9kZT4gcHE7ICAKCWRpc3Rbc10gPSAwOyAgCgljbnRbc10gPSAxOyAgIAoJcHEucHVzaCh7cywgZGlzdFtzXX0pOyAgCgoJd2hpbGUgKCFwcS5lbXB0eSgpKSB7CgkJTm9kZSBmcm9udCA9IHBxLnRvcCgpOyBwcS5wb3AoKTsgIAoJCWludCB1ID0gZnJvbnQudTsgbGwgZCA9IGZyb250LmQ7ICAKCgkJaWYgKGQgPiBkaXN0W3VdKSBjb250aW51ZTsgIAoKCQlmb3IgKGlpIHYgOiBhZGpbdV0pIHsKCQkJaWYgKGRpc3RbdV0gKyB2LnNlY29uZCA8IGRpc3Rbdi5maXJzdF0pIHsKCQkJCWRpc3Rbdi5maXJzdF0gPSBkaXN0W3VdICsgdi5zZWNvbmQ7ICAKCQkJCWNudFt2LmZpcnN0XSA9IGNudFt1XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCQkJcHEucHVzaCh7di5maXJzdCwgZGlzdFt2LmZpcnN0XX0pOyAgCgkJCX0KCQkJZWxzZSBpZiAoZGlzdFt1XSArIHYuc2Vjb25kID09IGRpc3Rbdi5maXJzdF0pIHsKCQkJCWFkZChjbnRbdi5maXJzdF0sIGNudFt1XSk7ICAKCQkJfQoJCX0KCX0KfQoKc2lnbmVkIG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IG4gPj4gbTsgCgoJZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKCQlpbnQgdSwgdiwgdzsgCgkJY2luID4+IHUgPj4gdiA+PiB3OyAKCQlhZGpbdV0ucHVzaF9iYWNrKHt2LCB3fSk7IAoJCXJhZGpbdl0ucHVzaF9iYWNrKHt1LCB3fSk7IAoJfQoKCWRpamtzdHJhKDEsIGFkaiwgZGlzdF8xLCBjbnRfMSk7IAoJZGlqa3N0cmEobiwgcmFkaiwgZGlzdF9uLCBjbnRfbik7IAoKCXZlY3RvcjxpbnQ+IGFuczsgIAoJZm9yIChpbnQgdSA9IDE7IHUgPD0gbjsgdSsrKSB7CgkJLy8gxJBp4buBdSBraeG7h24gxJHhu4MgxJHhu4luaCB1IG7hurFtIHRyw6puIE3hu4xJIMSRxrDhu51uZyDEkWkgbmfhuq9uIG5o4bqldCB04burIDEgxJHhur9uIG4KCQlpZiAoZGlzdF8xW3VdICsgZGlzdF9uW3VdID09IGRpc3RfMVtuXSAmJiAxbGwgKiBjbnRfMVt1XSAqIGNudF9uW3VdICUgTU9EID09IGNudF8xW25dKSB7CgkJCWFucy5wdXNoX2JhY2sodSk7IAoJCX0KCX0KCgljb3V0IDw8IGFucy5zaXplKCkgPDwgJ1xuJzsgCglmb3IgKGludCB1IDogYW5zKSBjb3V0IDw8IHUgPDwgJyAnOyAKfQ==