#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define FORR(i, m, n) for(int i = m;i >= n;i--)
#define SORT(v, n) sort(v, v+n);
#define VSORT(v) sort(v.begin(), v.end());
#define llong long long
#define pb(a) push_back(a)
#define INF 999999999
using namespace std;
typedef pair<int, int> P;
typedef pair<llong, llong> LP;
typedef pair<int, P> PP;
typedef pair<llong, LP> LPP;

//int dy[]={0, 0, 1, -1, 0};
//int dx[]={1, -1, 0, 0, 0};

struct edge{
  int to, cost;
};

int c, n, m, start, goal;
vector<edge> v[105];	       
vector<int> d(105, INF);
priority_queue<int> q, q2;

int dijkstra(int s){
  vector<int> d2(105, INF);
  
  q.push(s);
  while(!q.empty()){
    int u=q.top();
    q.pop();
    
    REP(i, v[u].size()){
      int to=v[u][i].to;
      int cost=v[u][i].cost;
      if(d[to]>d[u]+cost){
	d[to]=d[u]+cost;
	q.push(to);
      }
      if(d2[to]>d[u]+cost/2){
	d2[to]=d[u]+cost/2;
	q2.push(to);
      }
    }
  }
  
  d=d2;
  q=q2;
  while(!q2.empty()) q2.pop();
}

int main(){
  while(1){
    scanf("%d%d%d%d%d", &c, &n, &m, &start, &goal);
    start--; goal--;
    if(c==0) return 0;
    
    REP(i, m){
      int from, to, f;
      scanf("%d%d%d", &from, &to, &f);
      from--; to--;
      v[to].push_back((edge){from, f});
      v[from].push_back((edge){to, f});
    }

    d[start]=0;
    REP(i, c){
      dijkstra(start);
    }

    printf("%d\n", d[goal]);

    REP(i, 105){
      v[i].erase(v[i].begin(), v[i].end());
      d[i]=INF;
    }
  }
}