#include <bits/stdc++.h>
using namespace std;
class Point {
 public:
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double k) { return Point(x * k, y * k); }
  Point operator/(double k) { return Point(x / k, y / k); }
  bool operator<(Point p) const { return (x != p.x ? x < p.x : y < p.y); }
  bool operator==(Point p) const {
    return fabs(x - p.x) < (1e-11) && fabs(y - p.y) < (1e-11);
  }
  double abs() { return sqrt(norm()); }
  double norm() { return (x * x + y * y); }
};
class Segment {
 public:
  Point p1, p2;
  Segment(Point p1, Point p2) : p1(p1), p2(p2) {}
};
double norm(Point a) { return (a.x * a.x + a.y * a.y); }
double abs(Point a) { return sqrt(norm(a)); }
Point PointRotation(Point base, Point a, double r) {
  Point b = a - base;
  a.x = b.x * cos((r / 180) * M_PI) - b.y * sin((r / 180) * M_PI);
  a.y = b.x * sin((r / 180) * M_PI) + b.y * cos((r / 180) * M_PI);
  a = a + base;
  return a;
}
double dis[101][101];
vector<vector<Point> > Stars;
int N, M, L, x, y, a, r;
double getDis(vector<Point> a, vector<Point> b) {
  double mind = 100000000;
  for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
      mind = min(abs(a[i] - b[j]), mind);
    }
  }
  return mind;
}
double Dijkstra() {
  priority_queue<pair<double, int> > PQ;
  int color[101];
  double d[101];
  for (int i = 0; i < N; i++) {
    d[i] = 100000000;
    color[i] = 0;
  }
  d[M - 1] = 0;
  PQ.push(make_pair(0, M - 1));
  color[M - 1] = 0;
  while (!PQ.empty()) {
    pair<double, int> p = PQ.top();
    PQ.pop();
    int u = p.second;
    color[u] = 2;
    if (d[u] < p.first * (-1)) continue;
    for (int i = 0; i < N; i++) {
      if (color[i] == 2 || dis[u][i] == 100000000) continue;
      if (d[i] > dis[u][i] + d[u]) {
        d[i] = dis[u][i] + d[u];
        PQ.push(make_pair(d[i] * (-1), i));
        color[i] = 1;
      }
    }
  }
  return d[L - 1];
}
int main() {
  while (1) {
    cin >> N >> M >> L;
    if (N + M + L == 0) break;
    Stars.clear();
    for (int i = 0; i < N; i++) {
      cin >> x >> y >> a >> r;
      vector<Point> p;
      for (int i = 0; i < 5; i++) {
        p.push_back(PointRotation(Point(x, y), Point(x, y + r), (a + i * 72)));
      }
      Stars.push_back(p);
    }
    for (int i = 0; i < N; i++) {
      for (int j = 0; j < N; j++) {
        if (i == j) continue;
        dis[i][j] = getDis(Stars[i], Stars[j]);
      }
    }
    printf("%.10f\n", Dijkstra());
  }
  return 0;
}
