<pre name="code" class="cpp">//SPFA模版:
//HDU 1874
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <vector>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
typedef __int64 LL;
const int mx = 2e5 + 5;
const int inf = 0x3f3f3f3f;
int n,m,mp[1001][1001],d[1001];
bool visit[201];
void init() {
for(int i=0; i<=n; i++)
for(int j=0; j<=n; j++)
mp[i][j]=inf;
for(int i=0; i<=n; i++)
d[i]=inf,visit[i]=0;
}
void spfa(int s) {
queue<int> k;
k.push(s);
d[s]=0;
visit[s]=1;
while(!k.empty()) {
int h=k.front();
k.pop();
visit[h]=0;
for(int i=0; i<n; i++) {
if(d[i]-mp[h][i]>d[h]) {
d[i]=mp[h][i]+d[h];
if(!visit[i]) {
k.push(i);
visit[i]=1;
}
}
}
}
}
int main() {
while(scanf("%d%d",&n,&m)!=EOF) {
init();
int x,y,w;
for(int i=0; i<m; i++) {
scanf("%d%d%d",&x,&y,&w);
mp[x][y]=mp[y][x]=(w<mp[x][y]?w:mp[x][y]);
}
int s,t;
scanf("%d%d",&s,&t);
spfa(s);
if(d[t]==inf) puts("-1");
else printf("%d\n",d[t]);
}
return 0;
}
//HDU3342(拓扑排序模版)
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
struct khp {
int in;
set<int> k;
};
khp y[101];
bool final[101];
int n,m;
bool topu() {
int t,s=0,i,j;
bool judge=0;
for(i=0; i<n; i++)
if(y[i].in==0) {
t=i;
break;
}
if(i==n) return 0;
final[t]=1;
while(s<n) {
judge=0;
for(set<int>::iterator it=y[t].k.begin(); it!=y[t].k.end(); it++)
y[*it].in--;
for(i=0; i<n; i++)
if(y[i].in==0&&!final[i]) {
t=i;
s++;
final[t]=1;
judge=1;
break;
}
if(!judge)
break;
}
if(s!=n-1)
return 0;
else return 1;
}
int main() {
int i,j,a,b;
while(scanf("%d%d",&n,&m)!=EOF) {
for(i=0; i<101; i++) {
final[i]=0;
y[i].in=0;
y[i].k.clear();
}
if(!n&&!m) break;
for(i=0; i<m; i++) {
scanf("%d%d",&a,&b);
if(!y[b].k.count(a)) {
y[b].k.insert(a);
y[a].in++;
}
}
bool judge=topu();
if(!judge)
puts("NO");
else puts("YES");
}
return 0;
}