spfa
f数组存到此点所有的最小路径
/*
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,s,e;
struct oppo {
int to,nex,t,s;
} rod[605];
int head[305],tot;
void add(int from,int to,int s,int t) {
rod[++tot].to=to;
rod[tot].nex=head[from];
rod[tot].t=t;
rod[tot].s=s;
head[from]=tot;
}
struct iqoo {
int s,t;
} st;
deque< iqoo > f[305];
queue< int > v;
bool vis[305];
void work() {
v.push(s);
st.s=st.t=0;
f[s].push_back(st);
vis[s]=1;
while(v.size()) {
int lxl=v.front();
v.pop();
vis[lxl]=0;
for(int i=head[lxl]; i; i=rod[i].nex) {
int to=rod[i].to;
for(int j=0; j<f[lxl].size(); j++) {
int s=f[lxl][j].s+rod[i].s;
int t=f[lxl][j].t+rod[i].t;
bool flag=1;
int k=f[to].size();
while(k--) {
iqoo g=f[to].front();;
f[to].pop_front();
if(g.s<=s&&g.t<=t) {
flag=0;
f[to].push_back(g);
break;
} else if(s<=g.s&&t<=g.t) {
continue;
} else {
f[to].push_back(g);
}
}
if(flag) {
st.s=s;
st.t=t;
f[to].push_back(st);
if(!vis[to]) {
vis[to]=1;
v.push(to);
}
}
}
}
}
cout<<f[e].size()<<"\n";
}
int main() {
cin>>n>>m>>s>>e;
for(int i=1; i<=m; i++) {
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
add(a,b,c,d);
add(b,a,c,d);
}
work();
return 0;
}