#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 1e9
const int maxn=100+10;
int n,m;//点数,边数,点从0到n-1编号
int dist[maxn][maxn];//记录距离矩阵
int path[maxn][maxn];//path[i][j]=x表示i到j的路径上(除i外)的第一个点是x.
int A[maxn][maxn];
void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
A[i][j] = i==j?0:INF;//其实这里d[i][j]应该还要通过输入读数据的
}
//读取其他dist[i][j]的值
}
void floyd(int dis[][maxn])
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
dist[i][j]=A[i][j];
path[i][j]=j;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dist[i][k]<INF && dist[k][j]<INF && dist[i][k]>0 &&dist[k][j]>0)
{
if(dist[i][j]>dist[i][k]+dist[k][j])
{
dist[i][j] = dist[i][k]+dist[k][j];
path[i][j] = path[i][k];
}
else if(dist[i][j] == dist[i][k]+dist[k][j] &&path[i][j]>path[i][k])
{
path[i][j] = path[i][k]; //最终path中存的是字典序最小的路径
}
}
}
void pfpath(int u, int v) { //打印最短路径
while(u != v) {
cout << u << " ";
u = path[u][v];
}
cout << u << endl;
}
int main()
{
//读n和m
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=m;i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
A[x][y]=min(A[x][y],w);
A[y][x]=min(A[y][x],w);
}
//读m条边
floyd(A);
int u,v;
while(~scanf("%d%d",&u,&v))
{
//输出所求最短路径距离
pfpath(u,v);
}
return 0;
}