#include<stdio.h>
#include<stdlib.h>
#define N 100000000
typedef struct{
    int prev;
    int cur;
    int v;
}node_t;
node_t queue[N];
int head,num;
void enqueue(int prev,int cur,int v){
    if(num<N){
        queue[(head+num)%N].prev=prev;
        queue[(head+num)%N].cur=cur;
        queue[(head+num)%N].v=v;
        num++;
    }
    else{
        printf("エラー\n");
        exit(1);
    }
}
node_t dequeue(const double cost[31][31][31]){
    int index=head;
    double min=cost[queue[head].prev][queue[head].cur][queue[head].v];
    for(int i=head+1;i<head+num;i++){
        if(min>cost[queue[i%N].prev][queue[i%N].cur][queue[i%N].v]){
            min=cost[queue[i%N].prev][queue[i%N].cur][queue[i%N].v];
            index=i%N;
        }
    }
    node_t tmp=queue[head]; queue[head]=queue[index]; queue[index]=tmp;
    node_t d={-1,-1,-1};
    if(num>0){
        d=queue[head];
        head=(head+1)%N;
        num--;
    }
    return d;
}
int main(void){
    while(1){
        head=num=0;
        int n,m,s,g;
        int x,y,d,c;
        node_t tmp;
        int dist[31][31]={0},lim[31][31]={0},used[31][31][31]={0};
        //int node[31][31]={0};
        double cost[31][31][31]={0};
        scanf("%d%d%d%d",&n,&m,&s,&g);
        if(n+m==0) break;
        for(int i=1;i<=m;i++){
            scanf("%d%d%d%d",&x,&y,&d,&c);
            dist[x][y]=dist[y][x]=d; lim[x][y]=lim[y][x]=c;
        }
        enqueue(0,s,0);
        while(1){
            tmp=dequeue(cost);
            int prev=tmp.prev,cur=tmp.cur,v=tmp.v;
            if(prev==-1) break;
            for(int i=1;i<=n;i++){//i:新しい場所
                if(prev==i||cur==i||dist[cur][i]==0) continue;
                for(int j=v-1;j<v+2;j++){//速度 v-1,v,v+1
                    if(j<1||lim[cur][i]<j||used[cur][i][j]) continue;
                    if(cost[cur][i][j]==0||
                       cost[cur][i][j]>cost[prev][cur][v]+1.0*dist[cur][i]/j){
                        enqueue(cur,i,j);
                        used[cur][i][j]=1;
                        cost[cur][i][j]=cost[prev][cur][v]+1.0*dist[cur][i]/j;
                    }
                }
            }
        }
        double min=N;
        for(int i=1;i<=n;i++){
            if(cost[i][g][1]>0&&min>cost[i][g][1])
                min=cost[i][g][1];
        }
        if(min==N) printf("unreachable\n");
        else printf("%f\n",min);
    }
}

