#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace atcoder; typedef long long ll; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define repr(i, n) for (int i = (int)(n) - 1; i >= 0; i--) #define repk(i, k, n) for (int i = k; i < (int)(n); i++) #define all(v) v.begin(), v.end() #define mod1 1000000007 #define mod2 998244353 #define mod3 100000007 #define vi vector #define vs vector #define vc vector #define vl vector #define vb vector #define vvi vector> #define vvc vector> #define vvl vector> #define vvb vector> #define vvvi vector>> #define vvvl vector>> #define pii pair #define pil pair #define pli pair #define pll pair #define vpii vector> #define vpll vector> #define vvpii vector>> #define vvpll vector>> template void debug(T e) { cerr << e << endl; } template void debug(vector &v) { rep(i, v.size()) { cerr << v[i] << " "; } cerr << endl; } template void debug(vector> &v) { rep(i, v.size()) { rep(j, v[i].size()) { cerr << v[i][j] << " "; } cerr << endl; } } template void debug(vector> &v) { rep(i, v.size()) { cerr << v[i].first << " " << v[i].second << endl; } } template void debug(set &st) { for (auto itr = st.begin(); itr != st.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(multiset &ms) { for (auto itr = ms.begin(); itr != ms.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(map &mp) { for (auto itr = mp.begin(); itr != mp.end(); itr++) { cerr << itr->first << " " << itr->second << endl; } } void debug_out() { cerr << endl; } template void debug_out(Head H, Tail... T) { cerr << H << " "; debug_out(T...); } using mint = modint998244353; void debug_mint1(vector &vec) { for (int i = 0; i < vec.size(); i++) { cerr << vec[i].val() << " "; } cerr << endl; } void debug_mint2(vector> &vec) { for (int i = 0; i < vec.size(); i++) { for (int j = 0; j < vec[i].size(); j++) { cerr << vec[i][j].val() << " "; } cerr << endl; } } // ポテンシャル付 Union-Find // https://qiita.com/drken/items/cce6fc5c579051e64fab#%E9%87%8D%E3%81%BF%E3%81%A4%E3%81%8D-unionfind-%E6%9C%A8%E3%81%AE%E5%87%A6%E7%90%86 struct UnionFind { vector par; vector rank; vector diff_weight; UnionFind(int n = 1, ll SUM_UNITY = 0) { init(n, SUM_UNITY); } void init(int n = 1, ll SUM_UNITY = 0) { par.resize(n); rank.resize(n); diff_weight.resize(n); for (int i = 0; i < n; ++i) par[i] = i, rank[i] = 0, diff_weight[i] = SUM_UNITY; } int root(int x) { if (par[x] == x) { return x; } else { int r = root(par[x]); diff_weight[x] += diff_weight[par[x]]; return par[x] = r; } } ll weight(int x) { root(x); return diff_weight[x]; } bool issame(int x, int y) { return root(x) == root(y); } bool merge(int x, int y, ll w) { w += weight(x); w -= weight(y); x = root(x); y = root(y); if (x == y) return false; if (rank[x] < rank[y]) swap(x, y), w = -w; if (rank[x] == rank[y]) ++rank[x]; par[y] = x; diff_weight[y] = w; return true; } ll diff(int x, int y) { return weight(y) - weight(x); } }; ll INF = 1000000000023LL; vector find_route(vector> &graph, ll start, ll goal){ queue que; que.push(start); ll N = graph.size(); vector dist(N, INF); dist[start] = 0; while (que.size()){ ll p = que.front(); que.pop(); for (pll x: graph[p]){ if (dist[x.first] < INF) continue; dist[x.first] = dist[p] + 1; } } vector vec; ll now = goal; while (true){ if (now == start) break; for (pll x: graph[now]){ if (dist[x.first] < dist[now]){ vec.push_back(x.second); now = x.first; } } } reverse(all(vec)); return vec; } int main() { ll N, M; cin >> N >> M; vector u(M); vector v(M); vector w(M); for (ll i = 0; i < M; i++){ cin >> u[i] >> v[i] >> w[i]; u[i]--; v[i]--; } UnionFind tree(N); vector> graph(N, vector(0)); for (ll i = 0; i < M; i++){ if (!tree.issame(u[i], v[i])){ tree.merge(u[i], v[i], w[i]); graph[u[i]].push_back(make_pair(v[i], i)); graph[v[i]].push_back(make_pair(u[i], i)); } else if (tree.diff(u[i], v[i]) == w[i]){ continue; } else if (tree.diff(u[i], v[i]) < w[i]){ vector route = find_route(graph, v[i], u[i]); route.push_back(i); ll L = route.size(); cout << L << endl; cout << v[i] + 1 << endl; for (ll i = 0; i < L; i++){ cout << route[i] + 1; if (i < L - 1) cout << " "; } cout << endl; return 0; } else{ vector route = find_route(graph, u[i], v[i]); route.push_back(i); ll L = route.size(); cout << L << endl; cout << u[i] + 1 << endl; for (ll i = 0; i < L; i++){ cout << route[i] + 1; if (i < L - 1) cout << " "; } cout << endl; return 0; } } cout << -1 << endl; }