#include <bits/stdc++.h>
using namespace std;
inline int in() {
  int32_t x;
  scanf("%d", &x);
  return x;
}
inline long long lin() {
  long long x;
  scanf("%lld", &x);
  return x;
}
inline string get() {
  char ch[2000010];
  scanf("%s", ch);
  return ch;
}
const int MAX_LG = 21;
const long long maxn = 4e5 + 10;
const long long maxm = 1e5 + 10;
const long long base = 29;
const long long mod = 1e9 + 7;
const long long INF = 1e9 + 100;
const long long SQ = 317;
struct st {
  long long x, y, t;
  double p;
  inline bool operator<(const st &b) const { return t < b.t; }
} obj[maxn];
inline double di(long long x, long long y, long long x2, long long y2) {
  return sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
}
double res;
double dp[maxn];
int32_t main() {
  long long n = in();
  for (long long i = 0; i < n; i++) {
    obj[i].x = in(), obj[i].y = in(), obj[i].t = in();
    scanf("%lf", &obj[i].p);
  }
  sort(obj, obj + n);
  for (long long i = 0; i < n; i++) dp[i] = obj[i].p;
  for (long long i = 0; i < n; i++) {
    for (long long j = i + 1; j < n; j++) {
      if (di(obj[i].x, obj[i].y, obj[j].x, obj[j].y) <= (obj[j].t - obj[i].t)) {
        dp[j] = max(dp[j], dp[i] + obj[j].p);
      }
    }
    res = max(res, dp[i]);
  }
  cout << setprecision(10) << res << "\n";
}
