#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=200010;
struct node{
int dis,loc,cnt,las;
friend bool operator <(node x,node y){
return x.dis>y.dis||(x.dis==y.dis&&x.cnt>y.cnt);
}
};
struct zyx{
int to,w;
};
struct csq{
int to,w,tim,xh,num;
};
vector<zyx> e[N];
vector<csq> a[N];
priority_queue<node> q;
int n,m,dis[N][110],s,k,t;
bool vis[N][110];
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
void dijkstra(){
memset(dis,inf,sizeof dis);
q.push((node){t,1,-1,0});
dis[1][-1]=t;
while(!q.empty()){
int u=q.top().loc,cnt=q.top().cnt,las=q.top().las;
q.pop();
for(int i=0;i<a[u].size();i++){
int to=a[u][i].to,w=a[u][i].w;
int lun=ceil((dis[u][cnt]-a[u][i].tim)*1.0/a[u][i].xh);
int temp=a[u][i].tim+lun*a[u][i].xh,tt;
if(dis[u][cnt]<=a[u][i].tim)temp=a[u][i].tim;
if(las==a[u][i].num){
if(dis[to][cnt]>w+temp){
dis[to][cnt]=w+temp;
q.push((node){dis[to][cnt],to,cnt,a[u][i].num});
}
}
else if(cnt+1<=k){
if(dis[to][cnt+1]>w+temp){
dis[to][cnt+1]=w+temp;
q.push((node){dis[to][cnt+1],to,cnt+1,a[u][i].num});
}
}
}
}
}
signed main(){
n=read(),m=read();
s=read(),k=read(),t=read();
for(int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
e[u].push_back((zyx){v,w});
e[v].push_back((zyx){u,w});
}
for(int i=1;i<=s;i++){
int c=read(),x=read(),y=read();
int now=read(),d=0;
for(int j=2;j<=c;j++){
int t=read();
for(int k=0;k<e[now].size();k++){
int to=e[now][k].to;
if(to==t){
a[now].push_back((csq){to,e[now][k].w,d+x,y,i});
d+=e[now][k].w;
now=to;
break;
}
}
}
}
dijkstra();
int ans=inf;
for(int i=0;i<=k;i++)ans=min(ans,dis[n][i]);
if(ans==inf)cout<<"NIE";
else{
cout<<ans;
}
return 0;
}