#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,int>
#define fi first
#define se second
const int N=1e6+10;
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
int n,m,k,start,ed;
long long x;
vector<PII> ve[N];
long long go[N],to[N],st[N],dist1[N],dist2[N];
//dist1存从起点到其他点的距离,dist2存从终点到其他点的距离
void dijkstra_1()
{
priority_queue<PII,vector<PII>,greater<PII>>q;
q.push({0,start});
dist1[start]=0;
while(q.size())
{
auto t=q.top();q.pop();
int ver=t.se,dis=t.fi;
if(st[ver]) continue;
st[ver]=true;
for(int i=0;i<(int)ve[ver].size();i++)
{
int j=ve[ver][i].fi;
int d=ve[ver][i].se;
if(dist1[j]>dis+d)
{
dist1[j]=dis+d;
q.push({dist1[j],j});
}
}
}
}
void dijkstra_2()
{
priority_queue<PII,vector<PII>,greater<PII>>q;
q.push({0,ed});
dist2[ed]=0;
while(q.size())
{
auto t=q.top();q.pop();
int ver=t.se,dis=t.fi;
if(st[ver]) continue;
st[ver]=true;
for(int i=0;i<(int)ve[ver].size();i++)
{
int j=ve[ver][i].fi;
int d=ve[ver][i].se;
if(dist2[j]>dis+d)
{
dist2[j]=dis+d;
q.push({dist2[j],j});
}
}
}
}
int main()
{
scanf("%d %d %d %d %d %lld",&n,&m,&k,&start,&ed,&x);
memset(dist1,0x3f,sizeof(dist1));
memset(dist2,0x3f,sizeof(dist2));
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
ve[a].push_back({b,c});//链式向前星存边
ve[b].push_back({a,c});
}
for(int i=1;i<=k;i++)
{
scanf("%lld %lld",&go[i],&to[i]);
}
dijkstra_1(); memset(st,0,sizeof(st)); //记得清空st
dijkstra_2();
long long res=dist1[ed];//先让结果初始等于起点到终点的距离
int s1=-1,s2=-1,f=0;//s1,s2是免费边的两端点,f用于检测是否使用免费边
for(int i=1;i<=k;i++)
{
long long value1=dist1[go[i]]+dist2[to[i]];
long long value2=dist1[to[i]]+dist2[go[i]];
if(value1<res)
{
f=1;
s1=go[i];
s2=to[i];
res=value1;
}
if(value2<res)
{
f=1;
s1=go[i];
s2=to[i];
res=value2;
}
}
long long get=x-res;
if(get<0)
{
printf("No\n");
printf("-1 -1\n");
printf("No\n");
printf("-1\n");
}
else
{
if(f)
{
printf("Yes\n");
printf("%d %d\n",s1,s2);
}
else
{
printf("No\n");
printf("-1 -1\n");
}
printf("Yes\n");
printf("%lld\n",get);
}
return 0 - 0;
}