#include <iostream>
using namespace std;
#define MAX 100
typedef struct AMGraph{
int vexs[MAX];
int arcs[MAX][MAX];
int vexnum,arcnum;
}AMGraph;
void initG(AMGraph &G,int v,int a){
for(int i=1;i<=v;i++){
for(int j=1;j<=v;j++){
G.arcs[i][j] = MAX;
}
}
int i,j,w;
for(int k=0;k<a;k++){
cin>>i>>j>>w;
G.arcs[i][j] = w;
G.arcs[j][i] = w;
}
G.arcnum = a;
G.vexnum = v;
return;
}
void Dijkstra(AMGraph G,int M,int T,int A){
int l=G.vexnum+1;
int S[l],D[l],Path[l];
int Mw = (M%2)==1?1:2;
for(int i=1;i<l;i++){
S[i] = 0;
D[i] = G.arcs[M][i]+Mw;
Path[i] = G.arcs[M][i] < MAX+Mw?M:-1;
}
S[M] =1;
D[M] =0;
for(int i=1;i<G.vexnum;i++){
int min=MAX+2;
int op=-1;
for(int j=1;j<=G.vexnum;j++){
if(S[j]==0&&D[j] < min){
min = D[j];
op = j;
}
}
S[op] = 1;
for(int j=1;j<=G.vexnum;j++){
int wait = (op%2)==1?1:2;
if(S[j]==0&&D[op]+G.arcs[op][j]+wait < D[j]){
D[j] =D[op]+G.arcs[op][j]+wait;
Path[j] = op;
}
}
}
if(D[T] <= A)cout<<"YES "<<D[T]<<endl;
else cout<<"KENG"<<D[T]<<endl;
return;
}
int main(){
int N,S,M,T,A;
while(cin>>N>>S>>M>>T>>A){
AMGraph G;
initG(G,N,S);
Dijkstra(G,M,T,A);
}
return 0;
}