#include <bits/stdc++.h>
using namespace std;
struct Circle {
  int x, y, r;
  Circle(int x = 0, int y = 0, int r = 0) : x(x), y(y), r(r){};
  bool include(const Circle &that) const {
    if (r < that.r) {
      return false;
    }
    long long dist =
        1LL * (x - that.x) * (x - that.x) + 1LL * (y - that.y) * (y - that.y);
    return dist <= 1LL * (r - that.r) * (r - that.r);
  }
  bool operator<(const Circle &that) const {
    return r == that.r ? make_pair(x, y) < make_pair(that.x, that.y)
                       : r > that.r;
  }
  long long area() { return 1LL * r * r; }
};
int n;
vector<Circle> c;
vector<vector<int>> g;
long long dp[1002][2][2];
bool viz[1002];
void dfs(int node) {
  viz[node] = true;
  vector<vector<int64_t>> sum(2, vector<int64_t>(2));
  for (int i : g[node]) {
    dfs(i);
    for (int a = 0; a < 2; ++a)
      for (int b = 0; b < 2; ++b) sum[a][b] += dp[i][a][b];
  }
  for (int a = 0; a < 2; ++a) {
    for (int b = 0; b < 2; ++b) {
      dp[node][a][b] =
          sum[a ^ 1][b] + (a == 1 ? c[node].area() : -c[node].area());
      dp[node][a][b] =
          max(dp[node][a][b],
              sum[a][b ^ 1] + (b == 1 ? c[node].area() : -c[node].area()));
    }
  }
  sum.clear();
}
int main() {
  scanf("%d", &n);
  c.resize(n);
  g.resize(n);
  for (int i = 0; i < n; ++i) {
    cin >> c[i].x >> c[i].y >> c[i].r;
  }
  sort(c.begin(), c.end());
  for (int i = 0; i < n; ++i)
    for (int j = i - 1; j >= 0; --j) {
      if (c[j].include(c[i])) {
        g[j].push_back(i);
        break;
      }
    }
  long long tot = 0;
  for (int i = 0; i < n; ++i) {
    if (!viz[i]) {
      dfs(i);
      tot += dp[i][1][1];
    }
  }
  cout << fixed << setprecision(10) << (1.0 * tot * acos(-1));
  return 0;
}
