#include using namespace std; #define int long long #define REP(i,m,n) for(int i=(m);i<(n);i++) #define rep(i,n) REP(i,0,n) #define pb push_back #define all(a) a.begin(),a.end() #define rall(c) (c).rbegin(),(c).rend() #define mp make_pair #define endl '\n' //#define vec vector //#define mat vector > #define fi first #define se second #define double long double typedef long long ll; typedef unsigned long long ull; typedef pair pll; //typedef long double ld; typedef complex Complex; const ll INF=1e9+7; const ll MOD=998244353; const ll inf=INF*INF; const ll mod=INF; const ll MAX=1000010; const double PI=acos(-1.0); typedef vector > mat; typedef vector vec; signed main(){ ll n,m;cin>>n>>m; vector > > >G(n); ll u=-1,v=-1; char cc='.'; ll ccc=0; rep(i,m){ ll a,b;char c; cin>>a>>b>>c;a--,b--; G[a].pb(mp(b,mp(i+1,c))); G[b].pb(mp(a,mp(i+1,c))); } rep(i,n){ for(auto e:G[i]){ if(e.se.se!=G[0][0].se.se){ u=i,v=e.fi;cc=e.se.se; ccc=e.se.fi; } } } if(u==-1){ cout<d(n,inf); d[0]=0; queueq; vectorp(0); q.push(0); while(!q.empty()){ ll k=q.front(); q.pop(); for(auto e:G[k]){ if(d[e.fi]0){ ll nxt=-1; char c='.'; for(auto e:G[u]){ if(d[e.fi]==d[u]-1){ nxt=e.fi; c=e.se.se; p.pb(e.se.fi); break; } } pre+=c; u=nxt; } vectordd(n,inf); dd[n-1]=0; q.push(n-1); while(!q.empty()){ ll k=q.front(); q.pop(); for(auto e:G[k]){ if(dd[e.fi]0){ ll nxt=-1; char c='.'; for(auto e:G[v]){ if(dd[e.fi]==dd[v]-1){ nxt=e.fi; c=e.se.se; p.pb(e.se.fi); break; } } sur+=c; v=nxt; } string ans=pre+cc+sur; string ans2=ans; reverse(all(ans)); reverse(all(p)); if(ans2==ans){ p.pb(G[0][0].se.fi); p.pb(G[0][0].se.fi); } reverse(all(p)); cout<