#include <bits/stdc++.h>
#define F first
#define S second
#define INF 1<<26
using namespace std;
typedef pair<int,int>P;
typedef pair<int,P>PP;
typedef struct{
  int to,cost;
}Edge;
int main(){
  int c,n,m,st,go;
  while(1){
    int d[11111][111];
    cin >> c >> n >> m >> st >> go;
    if(c==0 && n==0 && m==0 && st==0 && go==0)break;
    for(int i=0;i<=m;i++){
      for(int j=0;j<=c;j++){
	d[i][j]=INF;
      }
    }
    st--;go--;
    
    int a,b,f;
    vector<Edge> G[1111];
    for(int i=0;i<m;i++){
      cin >> a >> b >> f;
      a--;b--;
      G[a].push_back((Edge){b,f});
      G[b].push_back((Edge){a,f});
    }
    priority_queue<PP,vector<PP>,greater<PP> >pq;
    pq.push(PP(0,P(st,c)));
    d[st][c]=0;
    while(!pq.empty()){
      PP p=pq.top();//左から、コスト、今いる場所、残りのチケット
      pq.pop();
      int now=p.S.F;//今いる場所
      int ti=p.S.S;//チケット
      for(int i=0;i<G[now].size();i++){
	Edge e=G[now][i];
	if(ti){//チケットがあったら
	  if(d[e.to][ti-1] > d[now][ti]+(e.cost/2)){
	    d[e.to][ti-1]=d[now][ti]+(e.cost/2);
	    pq.push(PP(d[e.to][ti-1],P(e.to,ti-1)));
	  }
	}
	if(d[e.to][ti] > d[now][ti]+e.cost){
	  d[e.to][ti]=d[now][ti]+e.cost;
	  // cout << d[e.to][ti] << endl;
	  pq.push(PP(d[e.to][ti],P(e.to,ti)));
	}
      } 
    }
    
    int ans=INF;
    for(int i=0;i<=c;i++){
      ans=min(ans,d[go][i]);
    }
    cout << ans << endl;
  }
}