#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define REV(i,a,b) for(int i=a;i>=b;i--)
#define psbk push_back
#define mkp make_pair
#define endl '\n'
using namespace std;
const int N=1e5+5;
const double INF=1e18;
struct Edge{int v,w,d;};
struct Node{
int id,fl;
double d;
bool operator < (const Node &a) const{
if(fl==a.fl)return d>a.d;
return fl>a.fl;
}
};
int n,m,k,h;
double dis[N*70];
bool bk[N*70];
vector<Edge>e[N*70];
int id(int p,int f){return f*n+p;}
void dfs(int u){
bk[u]=1;
if(u==h)return;
for(Edge p:e[u])
if(!bk[p.v])dfs(p.v);
}
double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr){
FOR(i,0,(k+1)*n+10)e[i].clear();
memset(bk,0,sizeof bk);
n=N,m=M,k=min(K,68),h=H;
FOR(i,0,m-1){
e[x[i]].psbk({y[i],c[i],1});
e[y[i]].psbk({x[i],c[i],1});
}
dfs(0);
if(!bk[h])return -1;
FOR(i,0,n+10)e[i].clear();
FOR(i,0,m-1)
FOR(j,0,k){
if(x[i]!=h){
e[id(x[i],j)].psbk({id(y[i],j),c[i],1});
if(arr[y[i]]==2&&j<k)e[id(x[i],j)].psbk({id(y[i],j+1),c[i],2});
}
if(y[i]!=h){
e[id(y[i],j)].psbk({id(x[i],j),c[i],1});
if(arr[x[i]]==2&&j<k)e[id(y[i],j)].psbk({id(x[i],j+1),c[i],2});
}
}
FOR(i,0,(k+1)*n+10)dis[i]=INF;
priority_queue<Node> q;
q.push({0,0,0}),dis[0]=0;
FOR(i,0,n-1)
if(!arr[i]&&bk[i])q.push({i,0,0}),dis[i]=0;
memset(bk,0,sizeof bk);
while(!q.empty()){
Node u=q.top();
q.pop();
int id=u.id;
if(bk[id])continue;
bk[id]=1;
for(auto i:e[id]){
int v=i.v,w=i.w,d=i.d;
if(dis[v]>(dis[id]+w)*1.0/d){
dis[v]=(dis[id]+w)*1.0/d;
if(!bk[v])q.push({v,v/n,dis[v]});
}
}
}
double ans=INF;
FOR(i,0,k)ans=min(ans,dis[id(h,i)]);
return ans;
}
record