//使用的算法:Dijkstra + 优先队列
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn = 1005;
const int INF = 1<<30;
int S, E;
struct Edge {
int from, to, dist;
Edge(int u, int v, int d):from(u), to(v), dist(d) {}
};
struct HeapNode{
int d, u;
bool operator < (const HeapNode& rhs) const {
return d > rhs.d;
}
};
struct Dijksdtra{
int n, m;
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn];
int d[maxn];
int p[maxn];
void init(int n) {
this->n = n;
for(int i = 0; i < n; i++) G[i].clear();
edges.clear();
}
void AddEdge(int from, int to, int dist) {
edges.push_back(Edge(from, to, dist));
m = edges.size();
G[from].push_back(m-1);
}
void dijkstra(int s) {
priority_queue<HeapNode> Q;
for(int i = 0; i < n; i++) d[i] = INF;
d[s] = 0;
memset(done, 0, sizeof(done));
Q.push((HeapNode){0, s});
while(!Q.empty()) {
HeapNode x = Q.top(); Q.pop();
int u = x.u;
if(done[u]) continue;
done[u] = true;
for(int i = 0; i < G[u].size(); i++) {
Edge& e = edges[G[u][i]];
if(d[e.to] > d[u] + e.dist) {
d[e.to] = d[u] + e.dist;
p[e.to] = G[u][i];
Q.push((HeapNode){d[e.to], e.to});
}
}
}
}
};
int main() {
int N, M;
Dijksdtra temp;
while(cin >> N >> M) {
temp.init(N);
int a, b, c;
for(int i = 0; i < M; i++) {
cin >> a >> b >> c;
temp.AddEdge(a, b, c);
temp.AddEdge(b, a, c);
}
cin >> S >> E;
temp.dijkstra(S);
if(!temp.done[E]) cout << -1 << endl;
else if(S == E) cout << 0 << endl;
else cout << temp.d[E] << endl;
}
return 0;
}