第四个点 WA 了,最短路长度不对,不知道为什么
#include<bits/stdc++.h>
#define N 200005
#define int long long
#define pi pair<int,int>
const int mod=1e9+7,base=2;
using namespace std;
int n,m,s,t,h[N],num,b[N],idx,dis[N],vis[N],ans[N],top,pre[N];
struct edge{
int u,v,w,nxt;
}e[N*2];
void add(int u,int v,int w){
e[++num]={u,v,w,h[u]};h[u]=num;
}
int a[N*40],lc[N*40],rc[N*40],c[N*40];
void pushup(int x,int l,int r,int mid){
a[x]=(a[lc[x]]+a[rc[x]]*b[mid-l+1])%mod;
c[x]=c[lc[x]]&c[rc[x]];
}
int build(int l,int r,int v){
int x=++idx;
if(l==r){
a[x]=v;c[x]=(v==1);return x;
}
int mid=(l+r)>>1;
lc[x]=build(l,mid,v);
rc[x]=build(mid+1,r,v);
pushup(x,l,r,mid);
return x;
}
void update0(int x,int &y,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr){
y=0;return;
}
if(!y)y=++idx;
a[y]=a[x];c[y]=c[x];lc[y]=lc[x];rc[y]=rc[x];
int mid=(l+r)>>1;
if(ql<=mid)update0(lc[x],lc[y],l,mid,ql,qr);
if(qr>mid)update0(rc[x],rc[y],mid+1,r,ql,qr);
pushup(y,l,r,mid);
}
void update1(int x,int &y,int l,int r,int k){
y=++idx;
if(l==r){
a[y]=c[y]=1;return;
}
a[y]=a[x];c[y]=c[x];lc[y]=lc[x];rc[y]=rc[x];
int mid=(l+r)>>1;
if(k<=mid)update1(lc[x],lc[y],l,mid,k);
else update1(rc[x],rc[y],mid+1,r,k);
pushup(y,l,r,mid);
}
int Find(int x,int l,int r,int ql,int qr){
if(ql>r||qr<l||c[x])return -1;
if(!a[x])return max(l,ql);
int mid=(l+r)>>1,ans=Find(lc[x],l,mid,ql,qr);
if(ans==-1)ans=Find(rc[x],mid+1,r,ql,qr);
return ans;
}
bool cmp(int x,int y,int l,int r){
if(l==r)return a[x]<a[y];
int mid=(l+r)>>1;
if(rc[x]==rc[y])return cmp(lc[x],lc[y],l,mid);
else return cmp(rc[x],rc[y],mid+1,r);
}
int add(int x,int w){
int tmp=0,rr=Find(x,1,N-5,w,N-5);
update1(x,tmp,1,N-5,rr);
if(rr>w)update0(tmp,tmp,1,N-5,w,rr-1);
return tmp;
}
bool operator<(pi a,pi b){
return cmp(a.first,b.first,1,N-5);
}
priority_queue<pi,vector<pi>,greater<pi> >q;
void dijkstra(){
int tmp=build(1,N-5,1);
for(int i=1;i<=n;++i)dis[i]=tmp;
dis[s]=build(1,N-5,0);q.push({dis[s],s});
while(!q.empty()){
pi c=q.top();q.pop();
int u=c.second;
if(vis[u])continue;
vis[u]=1;
for(int i=h[u];i;i=e[i].nxt){
int v=e[i].v,tmp=add(dis[u],e[i].w);
if(cmp(tmp,dis[v],1,N-5)){
dis[v]=tmp;pre[v]=u;
if(!vis[v])q.push({dis[v],v});
}
}
}
}
void dfs(int u){
if(u!=s)dfs(pre[u]);
ans[++top]=u;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
b[0]=1;
for(int i=1;i<N;++i)b[i]=b[i-1]*base%mod;
cin>>n>>m;
for(int i=1;i<=m;++i){
int u,v,w;cin>>u>>v>>w;++w;
add(u,v,w);add(v,u,w);
}
cin>>s>>t;
dijkstra();
if(!vis[t])return cout<<-1,0;
cout<<a[dis[t]]<<'\n';
dfs(t);
cout<<top<<'\n';
for(int i=1;i<=top;++i)cout<<ans[i]<<" ";
return 0;
}