#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int,int>;
using db = double;
const int N=3e5+10;
const ll INF=1e18;
struct edge{
    int from,to;
    ll w;
    edge(int a,int b,ll c){from=a;to=b;w=c;}
};
vector<edge> e[N];
struct node{
    int id;
    ll n_dis;
    node(int b,ll c){id=b;n_dis=c;}
    bool operator<(const node &a) const{
        return n_dis>a.n_dis;
    }
};
int n,m;
int pre[N];
void print_path(int s,int t){
    if(s==t){
        printf("%d",s);
        return;
    }
    print_path(s,pre[t]);
    printf("%d",t);
}
ll dis[N];
bool done[N];
void dijkstra(){
    int s=1;
    for(int i=1;i<=n;i++){
        dis[i]=INF;
        done[i]=false;
    }
    dis[s]=0;
    priority_queue<node> Q;
    Q.push(node(s,dis[s]));
    while(!Q.empty()){
        node u=Q.top();
        Q.pop();
        if(done[u.id]) continue;
        done[u.id]=true;
        for(int i=0;i<e[u.id].size();i++){
            edge y = e[u.id][i];
            if(done[y.to]) continue;
            if(dis[y.to]>y.w+u.n_dis){
                dis[y.to]=y.w+u.n_dis;
                Q.push(node(y.to,dis[y.to]));
                pre[y.to]=u.id;
            }
        }
    }
    print_path(s,n);
}
int main(){
    std::ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    return 0;
}