#include #include #include using namespace atcoder; using mint = modint998244353; using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf 1000000000 bool check(string s){ string t(s.rbegin(),s.rend()); return s!=t; } int main(){ int N,M; cin>>N>>M; vector A(M),B(M); vector C(M); vector> E(N); rep(i,M){ char c; cin>>A[i]>>B[i]>>c; A[i]--;B[i]--; C[i] = c - 'a'; E[A[i]].push_back(i); E[B[i]].push_back(i); } array AA = {Inf,Inf,Inf}; vector pre(N,vector(27,vector>(2,AA))); vector eind(N,vector(27,vector(2,-1))); pre[0][26][0] = {-1,-1,-1}; queue> Q; Q.push({0,26,0}); while(Q.size()>0){ int u = Q.front()[0],c = Q.front()[1],ff = Q.front()[2]; Q.pop(); rep(i,E[u].size()){ int ind = E[u][i]; int v = u ^ A[ind] ^ B[ind]; char nc = C[ind]; int nf = ff; if(c!=26 && nc!=c)nf = 1; if(pre[v][nc][nf]!=AA)continue; pre[v][nc][nf] = {u,c,ff}; eind[v][nc][nf] = ind; Q.push({v,nc,nf}); } } rep(i,26){ if(pre.back()[i][1]!=AA){ string S = ""; array cur = {N-1,i,1}; vector ans; while(cur[0]!=-1){ S += 'a' + cur[1]; ans.push_back(eind[cur[0]][cur[1]][cur[2]]); cur = pre[cur[0]][cur[1]][cur[2]]; } S.pop_back(); ans.pop_back(); reverse(ans.begin(),ans.end()); reverse(S.begin(),S.end()); while(!check(S)){ S += 'a'+i; S += 'a'+i; ans.push_back(eind[N-1][i][1]); ans.push_back(eind[N-1][i][1]); } cout<