#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
#define endl '\n'
#define vll vector<ll>
#define input(arr) \
for (auto& i : arr) cin >> i
#define print(arr) \
for (auto& i : arr) cout << i << ' '; cout << '\n'
#define INF LLONG_MAX
#define YARAB_ACCEPT ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
ll dx[] = {0, 0, -1, 1, 1, 1, -1, -1};
ll dy[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const ll N = 2e5 + 5;
struct Edge { ll to; char c; };
vector<Edge> adj[N];
void solve() {
ll n, m; cin >> n >> m;
for (ll i = 0; i < m; ++i) {
ll u, v; cin >> u >> v;
char c; cin >> c;
adj[u].push_back({v, c});
adj[v].push_back({u, c});
}
vll dist(n + 1, -1);
queue<ll> q;
dist[n] = 0;
q.push(n);
while (!q.empty()) {
ll u = q.front(); q.pop();
for (const auto& edge : adj[u]) {
if (dist[edge.to] == -1) {
dist[edge.to] = dist[u] + 1;
q.push(edge.to);
}
}
}
vll curr = {1}, parent(n + 1, -1), vis(n + 1, false);
string s = "";
vis[1] = 1;
for (int step = 0; step < dist[1]; ++step) {
char min_char = 'z' + 1;
for (auto u : curr) {
for (const auto& edge : adj[u]) {
if (dist[edge.to] == dist[u] - 1) {
min_char = min(min_char, edge.c);
}
}
}
s.push_back(min_char);
vll next_curr;
for (auto u : curr) {
for (const auto& edge : adj[u]) {
if (dist[edge.to] == dist[u] - 1 && edge.c == min_char) {
if (!vis[edge.to]) {
vis[edge.to] = 1;
parent[edge.to] = u;
next_curr.push_back(edge.to);
}
}
}
}
swap(curr, next_curr);
}
vll path;
ll curr_node = n;
while (curr_node != -1) {
path.push_back(curr_node);
curr_node = parent[curr_node];
}
reverse(path.begin(), path.end());
cout << dist[1] << '\n';
for (ll i = 0; i < path.size(); ++i) {
cout << path[i] << ' ';
}
cout << '\n';
cout << s << '\n';
}
signed main() {
YARAB_ACCEPT
ll t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBpbnQgbGwKI2RlZmluZSBlbmRsICdcbicKI2RlZmluZSB2bGwgdmVjdG9yPGxsPgojZGVmaW5lIGlucHV0KGFycikgXAogICAgZm9yIChhdXRvJiBpIDogYXJyKSBjaW4gPj4gaQojZGVmaW5lIHByaW50KGFycikgXAogICAgZm9yIChhdXRvJiBpIDogYXJyKSBjb3V0IDw8IGkgPDwgJyAnOyBjb3V0IDw8ICdcbicKI2RlZmluZSBJTkYgTExPTkdfTUFYCiNkZWZpbmUgWUFSQUJfQUNDRVBUIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKG51bGxwdHIpOyBjb3V0LnRpZShudWxscHRyKTsKCmxsIGR4W10gPSB7MCwgMCwgLTEsIDEsIDEsIDEsIC0xLCAtMX07CmxsIGR5W10gPSB7LTEsIDEsIDAsIDAsIC0xLCAxLCAtMSwgMX07CmNvbnN0IGxsIE4gPSAyZTUgKyA1OwoKc3RydWN0IEVkZ2UgeyBsbCB0bzsgY2hhciBjOyB9OwoKdmVjdG9yPEVkZ2U+IGFkaltOXTsKCnZvaWQgc29sdmUoKSB7CiAgICBsbCBuLCBtOyBjaW4gPj4gbiA+PiBtOwoKICAgIGZvciAobGwgaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgICAgICBsbCB1LCB2OyBjaW4gPj4gdSA+PiB2OwogICAgICAgIGNoYXIgYzsgY2luID4+IGM7CiAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh7diwgY30pOwogICAgICAgIGFkalt2XS5wdXNoX2JhY2soe3UsIGN9KTsKICAgIH0KCiAgICB2bGwgZGlzdChuICsgMSwgLTEpOwogICAgcXVldWU8bGw+IHE7CiAgICBkaXN0W25dID0gMDsKICAgIHEucHVzaChuKTsKCiAgICB3aGlsZSAoIXEuZW1wdHkoKSkgewogICAgICAgIGxsIHUgPSBxLmZyb250KCk7IHEucG9wKCk7CgogICAgICAgIGZvciAoY29uc3QgYXV0byYgZWRnZSA6IGFkalt1XSkgewogICAgICAgICAgICBpZiAoZGlzdFtlZGdlLnRvXSA9PSAtMSkgewogICAgICAgICAgICAgICAgZGlzdFtlZGdlLnRvXSA9IGRpc3RbdV0gKyAxOwogICAgICAgICAgICAgICAgcS5wdXNoKGVkZ2UudG8pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHZsbCBjdXJyID0gezF9LCBwYXJlbnQobiArIDEsIC0xKSwgdmlzKG4gKyAxLCBmYWxzZSk7CiAgICBzdHJpbmcgcyA9ICIiOwogICAgdmlzWzFdID0gMTsKCiAgICBmb3IgKGludCBzdGVwID0gMDsgc3RlcCA8IGRpc3RbMV07ICsrc3RlcCkgewogICAgICAgIGNoYXIgbWluX2NoYXIgPSAneicgKyAxOwoKICAgICAgICBmb3IgKGF1dG8gdSA6IGN1cnIpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZGdlIDogYWRqW3VdKSB7CiAgICAgICAgICAgICAgICBpZiAoZGlzdFtlZGdlLnRvXSA9PSBkaXN0W3VdIC0gMSkgewogICAgICAgICAgICAgICAgICAgIG1pbl9jaGFyID0gbWluKG1pbl9jaGFyLCBlZGdlLmMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzLnB1c2hfYmFjayhtaW5fY2hhcik7CgogICAgICAgIHZsbCBuZXh0X2N1cnI7CgogICAgICAgIGZvciAoYXV0byB1IDogY3VycikgewogICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVkZ2UgOiBhZGpbdV0pIHsKICAgICAgICAgICAgICAgIGlmIChkaXN0W2VkZ2UudG9dID09IGRpc3RbdV0gLSAxICYmIGVkZ2UuYyA9PSBtaW5fY2hhcikgewogICAgICAgICAgICAgICAgICAgIGlmICghdmlzW2VkZ2UudG9dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpc1tlZGdlLnRvXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFtlZGdlLnRvXSA9IHU7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfY3Vyci5wdXNoX2JhY2soZWRnZS50byk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzd2FwKGN1cnIsIG5leHRfY3Vycik7CiAgICB9CgogICAgdmxsIHBhdGg7CiAgICBsbCBjdXJyX25vZGUgPSBuOwoKICAgIHdoaWxlIChjdXJyX25vZGUgIT0gLTEpIHsKICAgICAgICBwYXRoLnB1c2hfYmFjayhjdXJyX25vZGUpOwogICAgICAgIGN1cnJfbm9kZSA9IHBhcmVudFtjdXJyX25vZGVdOwogICAgfQogICAgcmV2ZXJzZShwYXRoLmJlZ2luKCksIHBhdGguZW5kKCkpOwoKICAgIGNvdXQgPDwgZGlzdFsxXSA8PCAnXG4nOwoKICAgIGZvciAobGwgaSA9IDA7IGkgPCBwYXRoLnNpemUoKTsgKytpKSB7CiAgICAgICAgY291dCA8PCBwYXRoW2ldIDw8ICcgJzsKICAgIH0KCiAgICBjb3V0IDw8ICdcbic7CiAgICBjb3V0IDw8IHMgPDwgJ1xuJzsKfQoKc2lnbmVkIG1haW4oKSB7CiAgICBZQVJBQl9BQ0NFUFQKICAgIGxsIHQgPSAxOwogICAgLy8gY2luID4+IHQ7CiAgICB3aGlsZSAodC0tKQogICAgICAgIHNvbHZlKCk7CgogICAgcmV0dXJuIDA7Cn0=