#include<bits/stdc++.h>
#define S second
#define F first
#define EPS (1e-7)
#define INF (1e9)
#define N 31
using namespace std;
typedef pair<double,int> P;
typedef pair<int,int> P1;
typedef pair<int,P1> P2;
typedef pair<P,P1> P3;
typedef pair<P3,int> P4;

vector<P2> G[N];
int n,m,s,g;

double dijkstra(){
  P d[N][N][N];
  for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
      for(int k=0;k<N;k++)
	d[i][j][k]=P(INF,INF);
  priority_queue<P4,vector<P4>,greater<P4> > q;
  for(int i=0;i<G[s].size();i++){
    int nx=G[s][i].first,cost=G[s][i].second.first;
    d[s][nx][1]=P(cost,cost);
    q.push(P4(P3(P(cost,cost),P1(s,nx)),1));
  }
  while(!q.empty()){
    P4 t=q.top(); q.pop();
    int px=t.F.S.F,x=t.F.S.S,v=t.S,sum=t.F.F.S;
    double cost=t.F.F.F;
    if(d[px][x][v].F+EPS<cost)continue;
    if(abs(cost-d[px][x][v].F)<EPS)
      if(d[px][x][v].S<sum)continue;
    if(x==g&&v==1)return cost;
    for(int i=0;i<G[x].size();i++){
      int nx=G[x][i].F,cost2=G[x][i].S.F;
      int lim=G[x][i].S.S;
      if(nx==px)continue;
      for(int j=-1;j<=1;j++){
	int nv=v+j;
	if(nv<1||30<nv||nv>lim)continue;
	double ncost=cost+1.0*cost2/nv;
	if(d[x][nx][nv].F>ncost+EPS){
	  d[x][nx][nv]=P(ncost,sum+cost);
	  q.push(P4(P3(P(ncost,sum+cost),P1(x,nx)),nv));
	}
	/*if(abs(d[x][nx][nv].F-ncost)<EPS)
	  if(d[x][nx][nv].S>sum+cost){
	    d[x][nx][nv]=P(ncost,sum+cost);
	    q.push(P4(P3(P(ncost,sum+cost),P1(x,nx)),nv));
	    }*/
      }
    }
  }
  return -1;
}

int main(){
  while(1){
    cin>>n>>m;
    if(!n&&!m)break;
    cin>>s>>g;
    s--,g--;
    int a,b,c,d;
    for(int i=0;i<m;i++){
      cin>>a>>b>>c>>d;
      a--,b--;
      G[a].push_back(P2(b,P1(c,d)));
      G[b].push_back(P2(a,P1(c,d)));
    }
    double r=dijkstra();
    if(r==-1)cout<<"unreachable"<<endl;
    else printf("%.5f\n",r);
    for(int i=0;i<n;i++)G[i].clear();
  }
  return 0;
}