#include <stdio.h>
#include <memory.h>
#define MAXN 320
inline long sadic (long sadick) {
if (sadick<0) return -sadick;
else return sadick;
};
//atentie matrice mare! verifica dimdate!
long n,m;
long x,y;
long di[MAXN][MAXN];
char areInc[MAXN];
char areSfars[MAXN];
void pense(long Inc, long Sfars, long Dist) {
di[Inc][Sfars]=Dist;
if (!areInc[Inc]) areInc[Inc]=1;
else {
for (int j=Inc+1; j<=n; j++) if (di[Inc][j]!=0) if (j!=Sfars) {
// di[j][Sfars]=di[Inc][Sfars]-di[Inc][j];
// areSfars[j]=1;
if ((j<Sfars)&&(di[j][Sfars]==0)) {
// fprintf(stderr,"(1) spawned distance [%d %d] decuded from [%d %d] - [%d %d] = %d\n",j,Sfars,Inc,Sfars,Inc,j,sadic(di[Inc][Sfars]-di[Inc][j]));
pense(j,Sfars,sadic(di[Inc][Sfars]-di[Inc][j]));
};
};
};
if (!areSfars[Sfars]) areSfars[Sfars]=1;
else {
for (int j=Sfars-1; j>0; j--) if (di[j][Sfars]!=0) if (j!=Inc) {
di[j][Inc]=di[j][Sfars]-di[Inc][Sfars];
areInc[j]=1;
if ((j<Inc)&&(di[j][Inc]==0)) {
// fprintf(stderr,"(2) ! areSfars[%d]! spawned distance [%d %d] decuded from [%d %d] - [%d %d] = %d\n",Sfars,j,Inc,j,Sfars,Inc,Sfars,sadic(di[j][Sfars]-di[Inc][Sfars]));
pense(j,Inc,sadic(di[j][Sfars]-di[Inc][Sfars]));
};
};
};
};
int main (void) {
FILE * fi = fopen("sate.in","rt");
FILE * fo = fopen("sate.out","wt");
// long n,m;
// long x,y;
fscanf(fi,"%ld %ld %ld %ld",&n,&m,&x,&y);
memset(di,0,sizeof(di));
memset(areInc,0,sizeof(areInc));
memset(areSfars,0,sizeof(areSfars));
/* fprintf(stderr,"known distances: ");
for (int i=1; i<=n; i++) {
for (int j=1; j<=n; j++) {
fprintf(stderr,"%ld\t",di[i][j]);
};
fprintf(stderr,"\n");
}; */
//atentie distante mari verifica!!! (20 mil)
// long di[MAXN][MAXN];
// char areInc[MAXN];
// char areSfars[MAXN];
for (int i=1; i<=m; i++) {
long Inc,Sfars,Dist;
fscanf(fi,"%ld %ld %ld",&Inc,&Sfars,&Dist);
// fprintf(stderr,"(*) citit distanta %d %d %d\n",Inc,Sfars,Dist);
pense(Inc,Sfars,Dist);
/* di[Inc][Sfars]=Dist;
if (!areInc[Inc]) areInc[Inc]=1;
else {
for (int j=Inc+1; j<=n; j++) if (di[Inc][j]!=0) if (j!=Sfars) {
di[j][Sfars]=di[Inc][Sfars]-di[Inc][j];
areSfars[j]=1;
fprintf(stderr,"(1) spawned distance [%d %d] decuded from [%d %d] - [%d %d]\n",j,Sfars,Inc,Sfars,Inc,j);
};
};
if (!areSfars[Sfars]) areSfars[Sfars]=1;
else {
for (int j=Sfars-1; j>0; j--) if (di[j][Sfars]!=0) if (j!=Inc) {
di[j][Inc]=di[j][Sfars]-di[Inc][Sfars];
areInc[j]=1;
fprintf(stderr,"(2) ! areSfars[%d]! spawned distance [%d %d] decuded from [%d %d] - [%d %d]\n",Sfars,j,Inc,j,Sfars,Inc,Sfars);
};
};
*/
};
/* fprintf(stderr,"known distances: ");
for (int i=1; i<=n; i++) {
for (int j=1; j<=n; j++) {
fprintf(stderr,"%ld\t",di[i][j]);
};
fprintf(stderr,"\n");
};
fprintf(fo,"%ld",di[x][y]);
*/
fclose(fi); fclose(fo);
return 0;
};