Link to this code: https://cses.fi/paste/23f12e46d608700eae644f/
/*Jai Shri Ram*/
/*Jai Bajrang Bali*/
/*Hare krishna hare krishna krishna krishna hare hare hare rama hare rama rama hare hare*/
/*ॐ कृष्णाय वासुदेवाय हरये परमात्मने प्रणत क्लेशनाशाय गोविंदाय नमो नमः*/
#include<bits/stdc++.h>

using namespace std;

#define fastio() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define MOD 1000000007
#define INF 1e18
#define set_bits __builtin_popcountll
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()

#define int long long 
#define input(a) for (auto &x : a) cin >> x;
#define print(a) for (auto &x : a) cout << x << " ";cout << "\n";

vector<vector<pair<int,int>>> adj;
vector<int> cycle;
void dfs(int node,pair<int,int> edge,vector<bool> &vis,bool &flag){
    // cout << node << '\n';
    if(node == edge.first){
        flag = true;
        cycle.push_back(node+1);
        return;
    }
    if(vis[node]) return;
    vis[node] = true;
    for(auto &it : adj[node]){
        dfs(it.first,edge,vis,flag);
        if(flag) {
            cycle.push_back(node+1);
            return;
        }
    }
    vis[node] = false;
}
void init_1(){
    int n,m;
    cin >> n >> m;
    adj = vector<vector<pair<int,int>>>(n);
    vector<int> dis(n,INF);
    for(int i = 0;i < m;i++){
        int x,y,w;
        cin >> x >> y >> w;
        x--;
        y--;
        adj[x].push_back({y,w});
    }
    dis[0] = 0;
    // Running bellmanford 
    for(int j = 0;j < n-1;j++){
        for(int i = 0;i < n;i++){
            for(auto &it : adj[i]){
                // i to it.first with it.second weight
                // relax 
                if(dis[i] != INF && dis[i] + it.second < dis[it.first]) dis[it.first] = dis[i] + it.second; 
            }
        }
    } 
    pair<int,int> edge;
    int f = 0;
    // Run it one more time
    for(int i = 0;i < n;i++){
        for(auto &it : adj[i]){
            // i to it.first with it.second weight
            // relax 
            if(dis[i] != INF && dis[i] + it.second < dis[it.first]){
                edge.first = i;
                edge.second = it.first;
                f = 1;
                goto end;
            } 
        }
    }
    end:
    if(f){
       cout << "YES" << "\n";
       vector<bool> vis(n,false);
       vis[edge.first] = true;
    //    vis[edge.second] = true;
       bool gotCycle = false;
       dfs(edge.second,edge,vis,gotCycle);
       reverse(all(cycle));
       cycle.push_back(cycle[0]);
       print(cycle);
    }else{
        cout << "NO" << "\n";
    }
}

signed main() {
std::ios::sync_with_stdio(false);
    // fastio();
    int T = 1;
    // cin >> T;
    for(int k = 0 ; k < T ; k++){
        init_1();  
    }
}