rt,开大数组、换了好几种写法都是 TLE on #9,随机数据对拍也在 1s 左右。
// 超级无敌炫酷原神大王字典序最短路。
bool _Start;
#include<bits/stdc++.h>
#define Tp template<typename T>
#define Ts template<typename T,typename... _T>
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
char ibuf[1<<20],*p1=ibuf,*p2=ibuf,obuf[1<<20],*p3=obuf,*p4=obuf+(1<<20);
#define getchar() (p1==p2&&(p2=ibuf+fread(p1=ibuf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
#define flush() (fwrite(obuf,1,p3-obuf,stdout),p3=obuf)
#define putchar(c) (*p3++=c,p3==p4&&flush())
struct IO{~IO(){flush();}}_;
Tp inline void read(T &x){
x=0;static char c;static bool f;
c=getchar(),f=0;
for(;c<48||c>57;c=getchar())c=='-'&&(f=1);
for(;c>47&&c<58;c=getchar())x=x*10+(c^48);
if(c=='.'){
static long double s;s=0.1;
for(c=getchar();c>47&&c<58;c=getchar(),s/=10)x+=s*(c^48);
}
f&&(x=-x);
}
Ts inline void read(T &x,_T&... y){read(x),read(y...);}
Tp inline void write_uns(const T &x){
if(x>9)write_uns(x/10);
putchar(x%10^48);
}
Tp inline void write(const T &x){
if(x<0)putchar('-'),write_uns(~x+1);
else write_uns(x);
}
Tp inline void writesp(const T &x){write(x),putchar(' ');}
Tp inline void writeln(const T &x){write(x),putchar('\n');}
Ts inline void writesp(const T &x,const _T&... y){writesp(x),writesp(y...);}
Ts inline void writeln(const T &x,const _T&... y){writesp(x),writeln(y...);}
Tp inline void assign(T *a,int n,const T &b){while(n--)*a++=b;}
Tp inline void copy(T *a,const T *b,int n){while(n--)*a++=*b++;}
Tp inline T min(const T &a,const T &b){return a<b?a:b;}
Tp inline T max(const T &a,const T &b){return b<a?a:b;}
Ts inline T min(const T &a,const T &b,const _T&... c){return min(min(a,b),c...);}
Ts inline T max(const T &a,const T &b,const _T&... c){return max(max(a,b),c...);}
Tp inline T abs(const T &a){return max(a,-a);}
Tp inline T gcd(const T &a,const T &b){return !a?b:(!b?a:gcd(b,a%b));}
Tp inline T lcm(const T &a,const T &b){return a*b/gcd(a,b);}
Ts inline T gcd(const T &a,const T &b,const _T&... c){return gcd(gcd(a,b),c...);}
Ts inline T lcm(const T &a,const T &b,const _T&... c){return lcm(lcm(a,b),c...);}
Tp inline void ckmin(T &a,const T &b){b<a&&(a=b);}
Tp inline void ckmax(T &a,const T &b){a<b&&(a=b);}
constexpr int N=1e5+25,mod=1145140831,base=11213141,_mod=1e9+7,lim=1e5+20;
int n,m,s,t,cur;ll Pow[N],Has[N],Pow2[N];
#define mid ((l+r)>>1)
int idx,root[N],L[N*80],R[N*80];ll T[N*80];
int newnode(int p=0){return ++idx,L[idx]=L[p],R[idx]=R[p],T[idx]=T[p],idx;}
void pushup(int p,int l,int r){T[p]=(T[L[p]]+Pow[mid-l+1]*T[R[p]])%mod;}
void build(int &p,int l=0,int r=lim){
p=newnode();
if(l==r)return;
build(L[p],l,mid);
build(R[p],mid+1,r);
}
// 先 update 再 cover
void cover(int &p,int q,int x,int y,int l=0,int r=lim){
p=newnode(p);
if(x<=l&&r<=y){p=newnode(q);return;}
if(x<=mid)cover(L[p],L[q],x,y,l,mid);
if(mid<y)cover(R[p],R[q],x,y,mid+1,r);
pushup(p,l,r);
}
void update(int &p,int q,int x,int l=0,int r=lim){
p=newnode(q);
if(l==r){T[p]=1;return;}
if(x<=mid)update(L[p],L[q],x,l,mid);
else update(R[p],R[q],x,mid+1,r);
pushup(p,l,r);
}
int find(int p,int x,int l=0,int r=lim){
if(T[p]==Has[r-l+1])return -1;
if(l==r)return l;
if(x<=mid){
int res=find(L[p],x,l,mid);
if(~res)return res;
}
return find(R[p],x,mid+1,r);
}
int query(int p,int q,int l=0,int r=lim){
if(l==r)return T[p]<T[q];
if(T[R[p]]==T[R[q]])return query(L[p],L[q],l,mid);
return query(R[p],R[q],mid+1,r);
}
void add(int &p,int q,int u){
int v=find(q,u);
update(p,q,v);
if(u<v)cover(p,root[0],u,v-1);
}
ll calc(int p,int l=0,int r=lim){
if(!p)return 0;
if(l==r)return T[p]*Pow2[l];
return (calc(L[p],l,mid)+calc(R[p],mid+1,r))%_mod;
}
struct cmp{
bool operator ()(int a,int b)const{
return query(root[a],root[b]);
}
}_cmp;
struct edge{
int y,z;
edge(){y=z=0;}
edge(int _y,int _z){y=_y,z=_z;}
};
std::vector<edge> Gr[N];
std::multiset<int,cmp> q;
int from[N];
void Dijkstra(){
build(root[0]);
root[s]=root[0],q.insert(s);
while(q.size()){
int x=*q.begin();q.erase(q.begin());
for(auto &o:Gr[x]){
add(root[n+1],root[x],o.z);
if(!root[o.y]||_cmp(n+1,o.y)){
if(q.count(o.y))q.erase(q.find(o.y));
root[o.y]=root[n+1],from[o.y]=x;
q.insert(o.y);
}
}
}
}
std::vector<int> path;
bool _End;
signed main(){
fprintf(stderr,"Static Memory = %.4lf MiB\n",abs(&_Start-&_End)/1048576.0);
Pow[0]=Pow2[0]=1;
for(int i=1;i<=lim+1;i++){
Pow[i]=Pow[i-1]*base%mod;
Has[i]=(Has[i-1]*base+1)%mod;
Pow2[i]=Pow2[i-1]*2%_mod;
}
read(n,m);
for(int i=1,x,y,z;i<=m;i++){
read(x,y,z);
Gr[x].emplace_back(y,z);
Gr[y].emplace_back(x,z);
}
read(s,t);
Dijkstra();
if(s!=t&&!root[t])return writeln(-1),0;
writeln(calc(root[t]));
for(int i=t;i!=s;i=from[i])
path.emplace_back(i);
path.emplace_back(s);
std::reverse(path.begin(),path.end());
writeln((int)path.size());
for(auto &o:path)writesp(o);
putchar('\n');
return 0;
}