#include <climits>
#include <functional>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

int main() {
    int m,start,end,total;
    cin>>m>>start>>end>>total;
    if(start==end){return 0;}
    vector<vector<pair<int,int>>>graph(501+m);
    for(int i=501;i<501+m;i++){
        int ci,ni;
        cin>>ci>>ni;
        for(int j=1;j<=ni;j++){
            int sini;
            cin>>sini;
            graph[i].push_back({ci,sini});
            graph[sini].push_back({0,i});
        }
    }
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>>pq;
    vector<int>dist(501+m,INT_MAX);
    vector<bool>vis(501+m,false);
    pq.push({0,start});
    dist[start]=0;
    vis[start]=true;
    while (!pq.empty()) {
    auto [d,u]=pq.top();
    pq.pop();
    if(u==end){break;}
    if(d>dist[u]){continue;}
    for(auto [w,v]:graph[u]){
        if(vis[v]){continue;}
        int new_dist = dist[u] + w;
            // 如果找到更短的路径,更新距离和前驱
        if (new_dist < dist[v]) {
            dist[v] = new_dist;
            pq.push({new_dist, v});
        }
    }
    }
    if(dist[end]>total){
        cout<<"-1";
    }else {
    cout<<dist[end];
    }
    
    return 0;
}