#include <bits/stdc++.h>
using namespace std;
long long int x, y;
long long int gcd(long long int a, long long int b) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  long long int gc = gcd(b % a, a);
  long long int temp;
  temp = x;
  x = y - (b / a) * temp;
  y = temp;
  return gc;
}
struct circ {
  double x, y, r;

 public:
} cr[200005];
double dp[1004][4];
bool compare(circ lhs, circ rhs) { return lhs.r > rhs.r; }
double ar[200005];
vector<int> tr[1004];
double dist(circ lhs, circ rhs) {
  return sqrt((lhs.x - rhs.x) * (lhs.x - rhs.x) +
              (lhs.y - rhs.y) * (lhs.y - rhs.y));
}
double dfs(int node, int pl) {
  if (dp[node][pl] != -1 * 1e15) return dp[node][pl];
  double val = 0;
  if (pl == 0) {
    double temp = 0;
    for (int i = 0; i < tr[node].size(); i++) {
      temp += dfs(tr[node][i], 1);
      temp += ar[tr[node][i]];
    }
    val += temp;
  } else if (pl == 1) {
    double temp1 = 0;
    double temp2 = 0;
    for (int i = 0; i < tr[node].size(); i++) {
      temp1 = dfs(tr[node][i], 2) + ar[tr[node][i]];
      temp2 = dfs(tr[node][i], 0) - ar[tr[node][i]];
      val += max(temp1, temp2);
    }
  } else {
    double temp = 0;
    for (int i = 0; i < tr[node].size(); i++) {
      temp += dfs(tr[node][i], 1);
      temp -= ar[tr[node][i]];
    }
    val += temp;
  }
  dp[node][pl] = val;
  return val;
}
int main() {
  ios::sync_with_stdio(false);
  cout.tie(0);
  cin.tie(0);
  int n;
  cin >> n;
  int i;
  for (i = 1; i <= n; i++) {
    cin >> cr[i].x >> cr[i].y >> cr[i].r;
  }
  sort(cr + 1, cr + n + 1, compare);
  int j;
  int p;
  for (i = 1; i <= n; i++) {
    ar[i] = 3.1415926535898 * cr[i].r * cr[i].r;
    p = 0;
    for (j = i - 1; j > 0; j--) {
      if (dist(cr[i], cr[j]) <= abs(cr[i].r - cr[j].r)) {
        p = j;
        break;
      }
    }
    tr[p].push_back(i);
  }
  for (i = 0; i <= n; i++) {
    dp[i][0] = -1 * 1e15;
    dp[i][1] = -1 * 1e15;
    dp[i][2] = -1 * 1e15;
  }
  printf("%.10lf", dfs(0, 0));
}
