#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T abs(T x) {
  return x > 0 ? x : -x;
}
template <typename T>
inline T sqr(T x) {
  return x * x;
}
template <typename T>
inline T max(T a, T b, T c) {
  return max(max(a, b), c);
}
template <typename T>
inline T min(T a, T b, T c) {
  return min(min(a, b), c);
}
template <typename T>
inline bool toMax(T& a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
inline bool toMin(T& a, T b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline T gcd(T a, T b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
template <typename T, typename T1>
inline T qpower(T x, T p, T1 mod) {
  T re = 1;
  x %= mod;
  while (p) {
    if (p & 1) re = (re * x) % mod;
    x = (x * x) % mod;
    p >>= 1;
  }
  return re;
}
template <typename T1, typename T2>
inline T1 power(T1 x, T2 p) {
  return x < 0 && p < 1 && -1 < p ? p != 0 ? -pow(-x, p) : 1 : pow(x, p);
}
inline bool mr(long long x, long long b) {
  long long k = x - 1;
  while (k) {
    long long cur = qpower(b, k, x);
    if (cur != 1 && cur != x - 1) return false;
    if ((k & 1) == 1 || cur == x - 1) return true;
    k >>= 1;
  }
  return true;
}
inline bool isprime(long long x) {
  if (x == 46856248255981ll || x < 2) return false;
  if (x == 2 || x == 3 || x == 7 || x == 61 || x == 24251) return true;
  return mr(x, 2) && mr(x, 61);
}
template <typename T>
inline void read(T& res) {
  char c;
  res = 0;
  bool f = 0;
  while ((c = getchar()) < 48)
    if (c == '-') f = 1;
  do res = (res << 1) + (res << 3) + (c ^ 48);
  while ((c = getchar()) > 47);
  if (f) res = -res;
}
template <typename T>
inline string itos(T x) {
  stringstream ss;
  string str;
  ss << x;
  ss >> str;
  return str;
}
const double PI = acos(-1);
const double e = 2.718281828459;
const long long MOD = 1000000007;
const int MAXN = 1005;
const long long MAX = 1e18;
const int INF = 0x80000000;
struct P {
  int x;
  int y;
  long long t;
  double p;
  P(int x = 0, int y = 0, long long t = 0, double p = 0.0)
      : x(x), y(y), t(t), p(p) {}
  bool operator<(const P& x) const { return t < x.t; }
};
double dp[MAXN];
inline double dis(P a, P b) {
  return sqrt(sqr(b.x - a.x) * 1.0 + sqr(b.y - a.y) * 1.0);
}
vector<P> pos(1);
int main() {
  int n;
  cin >> n;
  for (register int i = 1; i <= n; i++) {
    int x, y;
    long long t;
    double p;
    cin >> x >> y >> t >> p;
    pos.push_back(P(x, y, t, p));
  }
  sort(pos.begin() + 1, pos.end());
  for (int i = 1; i <= n; i++) {
    dp[i] = pos[i].p;
    for (int j = 1; j < i; j++) {
      if (dis(pos[i], pos[j]) <= pos[i].t - pos[j].t)
        dp[i] = max(dp[i], dp[j] + pos[i].p);
    }
  }
  cout.setf(ios_base::fixed, ios_base::floatfield);
  cout.precision((8));
  cout << *max_element(dp + 1, dp + n + 1) << endl;
  return 0;
}
