#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <algorithm>
#include <functional>

struct Edge{
    int u, v, vel;
	bool operator<(const Edge &e) const{
		if(vel==e.vel)
			return (u==e.u ? v<e.v : u<e.u);
		return vel<e.vel;
	}
};

#define MAXN 505
#define INF 100000
using namespace std;
#ifdef _WIN32
#include <unordered_map>
#else
#include <tr1/unordered_map>
using namespace std::tr1;
#endif 
typedef pair<int, int> ii;
unordered_map<string, int> cityIDs;
vector<ii> graph[505];
int parents[505], dist[505], id, velocities[505];
char cityNames[505][32];

int getID(char cn[]){
	string cN = cn;
	int i = id;
	if( !cityIDs.count(cN) ){
		cityIDs[cN] = id;
		strcpy(cityNames[id], cn);
		id ++;
	}else
		i = cityIDs[cN];
	return i;
}


int BFS(int src, int dst){
	int u, uv, v, vv, i;
	queue<ii> q;
	Edge e;
	memset(dist, -1, sizeof(dist));
	dist[src] = 0, parents[src] = -1;
	q.push(ii(0, src));

	while(!q.empty()){
		uv = q.front().first, u = q.front().second;
		q.pop();

		if(u==dst)
			return dist[u];
		for(i=0; i<graph[u].size(); i++){
			v = graph[u][i].first, vv = graph[u][i].second;
			e.u = u, e.v = v, e.vel = vv;
			if(dist[v]==-1 && uv<=vv){
				q.push(ii(vv, v));
				dist[v] = 1+dist[u];
				parents[v] = u;
			}
		}
	}
	return -1;
}

void printPath(int u){
	if(parents[u]!=-1)
		printPath(parents[u]);
	printf("%s ", cityNames[u]);
}

int main(){
	int i, d, R, V, u, v;
	char inpLine[100], c1[50], c2[50];
	bool printLine = false;
#ifndef ONLINE_JUDGE
	freopen("C:\\acm_inp\\forro.in", "r", stdin);
	freopen("C:\\acm_inp\\forro.out", "w", stdout);
#endif

	while( scanf("%d\n", &R)==1 ){
		id = 0;

		for(i=0; i<505; i++)
			velocities[i] = 100000;
		while( R-- ){ 
			fgets(inpLine, 100, stdin);
			sscanf(inpLine, "%s %s %d", c1, c2, &V);
			u = getID(c1), v = getID(c2);
			graph[u].push_back(ii(v, V)), graph[v].push_back(ii(u, V));
		}
		for(i=0; i<id; i++)
			sort(graph[i].begin(), graph[i].end());

		if(printLine)
			printf("\n");
		else
			printLine = true;
		scanf("%s %s\n", c1, c2);
		u = getID(c1), v = getID(c2);
		d = BFS(u, v);
		if(d>0){
			printPath(parents[v]);
			printf("%s\n", cityNames[v]);
		}else
			printf("No valid route.\n");
		cityIDs.clear();
		for(i=0; i<id; i++)
			graph[i].clear();
	}

	return 0;
}

