正如题目所说的那样:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<bitset>
#include<queue>
using std::cin;using std::cout;
constexpr int N=500010,inf=0x7fffffff;
int n,m,b,e,head[N/5],then[N<<1],to[N<<1],way[N<<1],dis[N<<1],cnt,u,v,w,t,Dis[2][N/5][111],ans=inf;
struct node{
int a,x;
inline void scan(){
cin>>a>>x;
}
}f[N/5];
inline void add(int x,int y,int z){
to[++cnt]=y;
way[cnt]=z;
then[cnt]=head[x];
head[x]=cnt;
}
inline void SPFA(int st){
std::bitset<N>vis;
std::queue<int>q;
q.push(st);
vis[st]=1;
dis[st]=0;
while(!q.empty()){
int k=q.front();q.pop();
for(int i=head[k];i;i=then[i]){
int j=to[i],l=way[i];
if(dis[k]+l<dis[j]){
dis[j]=dis[k]+l;
if(!vis[j]) q.push(j),vis[j]=1;
}
}
}
}
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
std::ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
cin>>n>>m>>b>>e;
for(int i=1;i<=m;++i){
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
cin>>t;
for(int i=1;i<=t;++i) f[i].scan();
std::sort(f+1,f+t+1,[](node a,node b){return a.a<b.a;});
for(int i=1;i<=n;++i) dis[i]=inf;
Dis[0][f[0].x=e][++Dis[0][f[0].x][0]]=0;
for(int i=1;i<=t;++i){
Dis[1][f[i-1].x][++Dis[1][f[i-1].x][0]]=f[i].a;
Dis[0][f[i].x][++Dis[0][f[i].x][0]]=f[i].a;
}
Dis[1][f[t].x][++Dis[1][f[t].x][0]]=inf;
SPFA(b);
for(int i=1;i<=n;++i){
for(int j=1;j<=Dis[0][i][0];++j)
if(dis[i]<Dis[1][i][j])
ans=std::min(std::max(dis[i],Dis[0][i][j]),ans);
}
cout<<ans<<'\n';
return 0;
}