#include using namespace std; #define ll long long #define rep(i,n) for(int (i)=0;(i)<(n);(i)++) #define Pr pair #define Tp tuple using Graph = vector>>; const ll mod = 1000000007; int main() { ll N,M; cin >> N >> M; Graph G(N+1); vector> path; vector> cnt(N+1); rep(i,M){ ll a,b; char c; cin >> a >> b >> c; G[a].push_back(make_tuple(b,i+1,c)); G[b].push_back(make_tuple(a,i+1,c)); path.push_back(make_tuple(a,b,c)); cnt[a].insert(c); cnt[b].insert(c); } ll pt = 0; rep(i,N){ if(cnt[i+1].size()>1){ pt = i+1; break; } } if(pt==0){ cout << -1 << endl; return 0; } char d1,d2; int a1,a2; auto[aa,kk,dd] = G[pt][0]; a1 = kk; d1 = dd; int ss = aa; int tt; rep(i,G[pt].size()){ auto[a,k,d] = G[pt][i]; if(d!=d1){ a2 = k; tt = a; d2 = d; break; } } //cout << a1 << " " << a2 << endl; //cout << ss << " " << tt << endl; string S; vector ans; //BFS (普通の幅優先探索) queue go; ll dist[N+1],prev[N+1],used[N+1]; // ll par[N+1]; char cc[N+1]; rep(i,N+1){ dist[i] = 2000000000; prev[i] = 0; used[i] = 0; } dist[tt] = 0; go.push(tt); while(!go.empty()){ int s = go.front(); go.pop(); for(auto p:G[s]){ auto[x,k,d] = p; if(dist[x]<=dist[s]+1) continue; dist[x] = dist[s] + 1; prev[x] = s; used[x] = k; cc[x] = d; go.push(x); } } int n = N; while(prev[n]>0){ ans.push_back(used[n]); S += cc[n]; n = prev[n]; } S += d2; S += d1; ans.push_back(a2); ans.push_back(a1); rep(i,N+1){ dist[i] = 2000000000; prev[i] = 0; used[i] = 0; } dist[1] = 0; go.push(1); while(!go.empty()){ int s = go.front(); go.pop(); for(auto p:G[s]){ auto[x,k,d] = p; if(dist[x]<=dist[s]+1) continue; dist[x] = dist[s] + 1; prev[x] = s; used[x] = k; cc[x] = d; go.push(x); } } n = ss; while(prev[n]>0){ ans.push_back(used[n]); S += cc[n]; n = prev[n]; } string T = S; reverse(S.begin(),S.end()); if(S==T){ auto[a,k,d] = G[1][0]; ans.push_back(k); ans.push_back(k); } reverse(ans.begin(),ans.end()); cout << ans.size() << endl; for(ll yy:ans){ cout << yy << endl; } //cout << ans << endl; }