#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <set>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;
const int oo = 999999999;
int x[510], y[510], r[510], s[510], vis[510];
struct node1
{
int l, r;
}path[250000 + 10];
struct node2
{
int to, c, opp, f;
};
vector<node2> G[510];
int delt, k, n;
void fread()
{
freopen("network.in", "r", stdin);
freopen("network.out", "w", stdout);
}
void add_edge(int from, int t, int ll)
{
node2 p;
p.to = t;
p.c = ll;
p.f = 0;
p.opp = G[t].size();
G[from].push_back(p);
p.to = from;
p.c = ll;
p.f = ll;
p.opp = G[from].size() - 1;
G[t].push_back(p);
}
void update(int delta, int k)
{
for (int i = 0; i < k; i++)
{
int u = path[i].l;
int v = path[i].r;
G[u][v].f += delta;
G[G[u][v].to][G[u][v].opp].f -= delta;
}
}
bool find(int now)
{
if (now > n){
update(delt, k);
return true;
}
for (int i = 0; i < G[now].size(); i++)
{
if (G[now][i].c > G[now][i].f && vis[G[now][i].to] == 0){
delt = min(G[now][i].c - G[now][i].f, delt);
//printf("%d %d %d\n", now, i, delt);
path[k].l = now;
path[k++].r = i;
vis[now] = 1;
if (find(G[now][i].to)) return true;
k--;
vis[now] = 0;
}
}
return false;
}
int FF()
{
int flow = 0;
for (;;)
{
delt = oo, k = 0;
memset(vis, 0, sizeof(vis));
if (!find(0)) return flow;
else flow += delt;
}
}
int main()
{
fread();
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d%d%d%d", &x[i], &y[i], &r[i], &s[i]);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (i != j){
if (r[i] * r[i] > (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]))
add_edge(i, j, oo);
}
int totyl = 0;
for (int i = 1; i <= n; i++)
if (s[i] > 0) {
add_edge(0, i, s[i]);
totyl += s[i];
}
else add_edge(i, n + 1, -s[i]);
printf("%d\n", totyl - FF());
return 0;
}