#include <iostream>
#include <vector>
#include <queue>
#include <functional>
#include <algorithm>

constexpr int MAX_N = 100, INF = (int)1e9;
using P = std::pair<std::pair<int, int>,int>;

struct edge {
	int to_, cost_;
	edge() = default;
	edge(int to, int cost) : to_(to), cost_(cost) {}
};

int c, n;
std::vector<edge> G[MAX_N];
int d[MAX_N];

int dijkstra(int s, int g) {
	std::fill(d, d + n, INF);
	std::priority_queue<P, std::vector<P>, std::greater<P>> que;
	d[s] = 0;
	que.emplace(std::make_pair(d[s], s), c);
	while (!que.empty()) {
		P p = que.top(); que.pop();
		int v = p.first.second;
		if (v == g)
			break;
		for (int i = 0; i < G[v].size(); ++i) {
			edge e = G[v][i];
			if (p.second > 0 && d[e.to_] > d[v] + e.cost_ / 2) {
				d[e.to_] = d[v] + e.cost_ / 2;
				que.emplace(std::make_pair(d[e.to_], e.to_), p.second - 1);
			}
			if (d[e.to_] > d[v] + e.cost_) {
				d[e.to_] = d[v] + e.cost_;
				que.emplace(std::make_pair(d[e.to_], e.to_), p.second);
			}
		}
	}
	return d[g];
}

int main() {
	int m, s, g;
	while (1) {
		std::cin >> c >> n >> m >> s >> g;
		if (c + n + m + s + g == 0)
			break;
		for (int i = 0; i < n; ++i)
			G[i].clear();
		--s;
		--g;
		int a, b, f;
		for (int i = 0; i < m; ++i) {
			std::cin >> a >> b >> f;
			--a;
			--b;
			G[a].push_back(edge(b, f));
			G[b].push_back(edge(a, f));
		}
		std::cout << dijkstra(s, g) << std::endl;
	}
	return 0;
}