#include // #include // #include // using namespace __gnu_pbds; // #define ordered_set tree, rb_tree_tag,tree_order_statistics_node_update> // #define ordered_multiset tree, rb_tree_tag,tree_order_statistics_node_update> using namespace std; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); return 0; } using ll = long long; using ull = unsigned long long; using ld = long double; using vi = std::vector; using vvi = std::vector; using vl = std::vector; using vii = std::vector >; using vvl = std::vector; using vll = std::vector >; using vd = std::vector; using vvd = std::vector; using vs = std::vector; using vvs = std::vector; using vb = std::vector; using vvb = std::vector; using vc = std::vector; using vvc = std::vector; using pii = std::pair; using pll = std::pair; using piil = std::pair, ll>; using mii = std::map; using mll = std::map; using pql = std::priority_queue; using pqi = std::priority_queue; using pqiil = std::priority_queue, ll> >; using pqii = std::priority_queue >; #define pb push_back #define ps push #define eb emplace_back #define is insert #define er erase #define f first #define s second #define lb lower_bound #define ub upper_bound #define sf(i) sizeof(i) #define endl "\n" #define sz(v) ((int)(v).size()) #define all(v) (v).begin(), (v).end() #define rep(i, L, R) for(ll i = L;i<=R;i++) #define pcis precision template struct infinity { static constexpr T max=std::numeric_limits::max(); static constexpr T min=std::numeric_limits::min(); static constexpr T value=std::numeric_limits::max()/2; static constexpr T mvalue=std::numeric_limits::min()/2; }; templateconstexpr T INF=infinity::value; constexpr ll lINF=INF; constexpr int iINF = INF; constexpr ld PI = 3.1415926535897932384626; bool vst[100001]; vector> adj[100001]; ll A[100001]; ll at = -1; ll at2 = -1; ll at3 = 0; vll adj2[100001]; void DFS(ll node, ll atai) { vst[node] = true; A[node] = atai; if (at != -1)return; for (auto ss : adj[node]) { ll i = ss.f; auto[ cst, num] = ss.s; if (vst[i]) { if (A[i] != atai+cst) { if (at == -1) { if (atai+cst > A[i]) { at = node; at2 = i;// at -> at2임 at3 = num; return; } else { // 반대로 돌아야함 at = i; at2 = node;// at2 -> at임 at3 = num; return; } } } } else { adj2[node].pb({i, num}); adj2[i].pb({node, num}); DFS(i, cst+atai); } } return; } // at2에서 시작하면 됨 vl lst; bool DFS2(ll node, ll par) { if (node == at) { return true; } for (auto [i, num] : adj2[node]) { if (i==par)continue; if (DFS2(i, node)) { lst.pb(num); return true; } } } void _main() { ll N, M; cin >> N >> M; for (ll i = 1; i<=M; i++) { ll a, b, c; cin >>a >> b >> c; adj[a].pb({b,{c,i}}); adj[b].pb({a,{-c,i}}); } DFS(1, 0); if (at == -1) { cout << -1 << endl; return; } DFS2(at2, -1); reverse(all(lst)); lst.pb(at3); cout << lst.size() << endl; cout << at2 << endl; for (auto i : lst) { cout << i << " "; } cout << endl; }