#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define MAXN 5555
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
using namespace std;
/*
题意:模板
想法:单源最短路
*/
int n;
int Edge[MAXN][MAXN];//邻接矩阵
int s[MAXN];//判断点是否加入
int dist[MAXN];//每个点与源点的最短距离
int path[MAXN];//路径
int i,j,k;
void init()
{
int i,j;
for(i=0;i<MAXN;i++)
{
for(j=0;j<MAXN;j++)
{
Edge[i][j]=MAX;
}
}
}
void Dijstra(int v0)
{
for(i = 1;i<=n;i++)
{
dist[i] = Edge[v0][i];
s[i] = 0;
}
s[v0] = 1;
dist[v0] = 0;
for(i = 1;i<=n;i++)
{
int min = MAX;
int u = -1;
for(j = 1;j<=n;j++)
{
if(!s[j]&&dist[j]<min)
{
u = j;
min = dist[j];
}
}
s[u] = 1;
for(k = 1;k<=n;k++)
{
if(!s[k]&&(dist[u]+Edge[u][k]<dist[k]))
{
dist[k] = dist[u]+Edge[u][k];
}
}
}
}
int main()
{
int m,d,e;
int a,b,c;
while(~scanf("%d%d%d%d",&n,&m,&d,&e))
{
init();
for(i = 0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(Edge[a][b]>c)
{
Edge[a][b] = Edge[b][a] = c;
}
}
Dijstra(d);
printf("%d\n",dist[e]);
}
return 0;
}
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define MAXN 5555
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
using namespace std;
/*
题意:模板
想法:单源最短路
*/
int n;
int Edge[MAXN][MAXN];//邻接矩阵
int s[MAXN];//判断点是否加入
int dist[MAXN];//每个点与源点的最短距离
int path[MAXN];//路径
int i,j,k;
void init()
{
int i,j;
for(i=0;i<MAXN;i++)
{
for(j=0;j<MAXN;j++)
{
Edge[i][j]=MAX;
}
}
}
void Dijstra(int v0)
{
for(i = 1;i<=n;i++)
{
dist[i] = Edge[v0][i];
s[i] = 0;
}
s[v0] = 1;
dist[v0] = 0;
for(i = 1;i<=n;i++)
{
int min = MAX;
int u = -1;
for(j = 1;j<=n;j++)
{
if(!s[j]&&dist[j]<min)
{
u = j;
min = dist[j];
}
}
s[u] = 1;
for(k = 1;k<=n;k++)
{
if(!s[k]&&(dist[u]+Edge[u][k]<dist[k]))
{
dist[k] = dist[u]+Edge[u][k];
}
}
}
}
int main()
{
int m,d,e;
int a,b,c;
while(~scanf("%d%d%d%d",&n,&m,&d,&e))
{
init();
for(i = 0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(Edge[a][b]>c)
{
Edge[a][b] = Edge[b][a] = c;
}
}
Dijstra(d);
printf("%d\n",dist[e]);
}
return 0;
}