#include <bits/stdc++.h>

using namespace std;

struct cvor{
	bool posecenCvor;	//
	int upaljena;		// 0 ako nije, 1 ako jeste, 2 ako je svejedno
	int ToggleCount;	// broj paljenja/gašenja	
};

int indeksMinNeposecenog(struct cvor cvorovi[], int cvorova){
	int minIndeks = -1;
	struct cvor min = {false, 0, 499999};
	for (int i = 0; i < cvorova; i++){
		if ((cvorovi[i].ToggleCount < min.ToggleCount) && (!cvorovi[i].posecenCvor)){
			min = cvorovi[i];
			minIndeks = i;
		}
	}

	return minIndeks;
}

bool nemaNeposecenog(struct cvor cvorovi[], int cvorova){
	for (int i = 0; i < cvorova; i++){
		if (!cvorovi[i].posecenCvor){
			return false;
		}
	}

	return true;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
	
	int cvorova, brojGrana;
	cin >> cvorova >> brojGrana;

	struct cvor cvorovi[cvorova];				// stanja cvorova (koliko je do sad potrebno gašenja paljenja mašine, da li je to ukoliko je ugašena mašina, da li je posecena grana)
	vector<int> grane[cvorova];					// Vektor grane[i] sadrži sve cvorove susedne cvoru i: 2*susedanCvor + 1 (ako ima kockica leda)

	for (int i = 0; i < cvorova; i++){
		cvorovi[i] = {false, 0, 500000};		//500000 je vece od 200000, što je gornja granica za broj grana i cvorova, tkd ne može biti više od broja paljenja gašenja.	
	}

	int a, b, t;
	for (int i = 0; i < brojGrana; i++){
		cin >> a >> b >> t;
		grane[a-1].push_back((b-1)*2+t);
	}

	int start, end;
	cin >> start >> end;
	start--;
	end--;

	int grana;
	for (auto i: grane[start]){
		grana = i / 2;
		cvorovi[grana] = {false, (i % 2), (i % 2)};
	}

	int min;
	struct cvor stanjeCvora, novoStanje;		// Ova dva se odnose na razlicite stvari ali ajde
	while (!nemaNeposecenog(cvorovi, cvorova)){
		min = indeksMinNeposecenog(cvorovi, cvorova);

		if (min == -1){
			if (cvorovi[end].ToggleCount == 500000){
				cout << -1;
			} else {
				cout << cvorovi[end].ToggleCount;
			}
		
			return 0;
		}
		
		stanjeCvora = cvorovi[min];
		cvorovi[min].posecenCvor = true;
		for (auto i: grane[min]){
			novoStanje = {false, 0, stanjeCvora.ToggleCount};
			grana = i / 2;

			if (stanjeCvora.upaljena == 0){
				if (i % 2 == 1){
					novoStanje.ToggleCount++;
					novoStanje.upaljena = 1;
				}
			} else if (stanjeCvora.upaljena == 1){
				if (i % 2 == 0){
					novoStanje.ToggleCount++;
					novoStanje.upaljena = 0;
				} else {
				    novoStanje.upaljena = 1;
				}
			}

			if (novoStanje.ToggleCount < cvorovi[grana].ToggleCount){
				cvorovi[grana] = novoStanje;
			} else if (novoStanje.ToggleCount == cvorovi[grana].ToggleCount){
				if (novoStanje.upaljena + cvorovi[grana].upaljena == 1){
					cvorovi[grana].upaljena = 2;
				}
			}
		}
	}
		
	cout << cvorovi[end].ToggleCount;

	return 0;
}