#include <bits/stdc++.h>   using namespace std;   const int INF = 2000000000;   using namespace std;   template <typename A, typename B>   string to_string(pair<A, B> p);   template <typename A, typename B, typename C>   string to_string(tuple<A, B, C> p);   template <typename A, typename B, typename C, typename D>   string to_string(tuple<A, B, C, D> p);   string to_string(const string& s) { return     + s +    ; }   string to_string(const char* s) { return to_string((string)s); }   string to_string(bool b) { return (b ?  true  :  false ); }   string to_string(vector<bool> v) {     bool first = true;     string res =  { ;     for (int i = 0; i < static_cast<int>(v.size()); i++) {       if (!first) {         res +=  ,  ;       }       first = false;       res += to_string(v[i]);     }     res +=  } ;     return res;   }   template <size_t N>   string to_string(bitset<N> v) {     string res =   ;     for (size_t i = 0; i < N; i++) {       res += static_cast<char>( 0  + v[i]);     }     return res;   }   template <typename A>   string to_string(A v) {     bool first = true;     string res =  { ;     for (const auto& x : v) {       if (!first) {         res +=  ,  ;       }       first = false;       res += to_string(x);     }     res +=  } ;     return res;   }   template <typename A, typename B>   string to_string(pair<A, B> p) {     return  (  + to_string(p.first) +  ,   + to_string(p.second) +  ) ;   }   template <typename A, typename B, typename C>   string to_string(tuple<A, B, C> p) {     return  (  + to_string(get<0>(p)) +  ,   + to_string(get<1>(p)) +  ,   +            to_string(get<2>(p)) +  ) ;   }   template <typename A, typename B, typename C, typename D>   string to_string(tuple<A, B, C, D> p) {     return  (  + to_string(get<0>(p)) +  ,   + to_string(get<1>(p)) +  ,   +            to_string(get<2>(p)) +  ,   + to_string(get<3>(p)) +  ) ;   }   void debug_out() { cerr << endl; }   template <typename Head, typename... Tail>   void debug_out(Head H, Tail... T) {     cerr <<     << to_string(H);     debug_out(T...);   }   long long n;   vector<int> adj[200005];   vector<bool> visited;   vector<int> ans;   void dfs(int v) {     visited[v] = true;     for (int u : adj[v]) {       if (!visited[u]) dfs(u);     }     ans.push_back(v);   }   void topological_sort() {     visited.assign(n, false);     ans.clear();     for (int i = 0; i < n; ++i) {       if (!visited[i]) dfs(i);     }     reverse(ans.begin(), ans.end());   }   long long p2(long long x) { return x * x; }   long long dist2(pair<long long, long long> p, pair<long long, long long> q) {     return p2(p.first - q.first) + p2(p.second - q.second);   }   int main() {     ios::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     cin >> n;     vector<long long> t(n);     vector<double> p(n);     vector<pair<long long, long long> > x(n);     for (int i = (0); i < (int)(n); i++) {       long long ti, xi, yi;       double pi;       cin >> xi >> yi >> ti >> pi;       t[i] = ti, p[i] = pi;       x[i] = {xi, yi};     }     for (int i = (0); i < (int)(n); i++) {       for (int j = (0); j < (int)(n); j++) {         if (t[i] < t[j] && p2(t[i] - t[j]) >= dist2(x[j], x[i]))           adj[i].push_back(j);       }     }     vector<double> dp(n, 0);     for (int i = (0); i < (int)(n); i++) dp[i] = p[i];     topological_sort();     for (int iii = (0); iii < (int)(n); iii++) {       long long i = ans[iii];       for (auto j : adj[i]) dp[j] = max(dp[j], dp[i] + p[j]);     }     for (int i = (0); i < (int)(n); i++) 42;     42;     42;     double out = dp[0];     for (int i = (0); i < (int)(n); i++) out = max(out, dp[i]);     cout << fixed << setprecision(10) << out << endl;     return 0;   }