//#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#include "cyberland.h"
const int sz=1000000,INF=1000000000;
using namespace std;
int node,res,ans;
vector<int>dist;
vector<vector<pair<int,int>>>nums;
void dijkstra(int num)
{
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
pq.push({0,num});
dist[num]=0;
while(pq.size()!=0)
{
res=pq.top().second;
pq.pop();
if(dist[res]==INF)
{
for(int i=0;i<nums[res].size();i++)
{
if(dist[res]+nums[res][i].second<dist[nums[res][i].first])
{
pq.push({dist[res]+nums[res][i].second,nums[res][i].first});
dist[nums[res][i].first]=dist[res]+nums[res][i].second;
}
}
}
}
}
double solve(int n,int m,int l,int p,vector<int>nums1,vector<int>nums2,vector<int>nums3,vector<int>nums4)
{
nums.clear(),dist.clear(),nums.resize(n+1),dist.resize(n+1),fill(dist.begin(),dist.end(),INF);
for(int i=0;i<nums1.size();i++)
{
nums[nums1[i]].push_back({nums2[i],nums3[i]}),nums[nums2[i]].push_back({nums1[i],nums3[i]});
}
dijkstra(0);
ans=dist[p];
if(dist[p]==INF)
{
ans=-1;
}
return ans;
}