#include <bits/stdc++.h>
using namespace std;
double PI = atan(1) * 4.00000000000;
const int nmax = 1010;
struct circle {
  long long x, y, r;
};
bool comp(circle& A, circle& B) { return A.r < B.r; }
bool isInside(const circle& A, const circle& a) {
  return (abs(A.x - a.x) * abs(A.x - a.x) + abs(A.y - a.y) * abs(A.y - a.y)) <=
             A.r * A.r &&
         A.r > a.r;
}
double getArea(circle& A) { return PI * (double)(A.r) * (double)(A.r); }
int n;
vector<circle> vec;
vector<int> graph[nmax];
bool visited[nmax];
bool isChild[nmax];
void read() {
  cin >> n;
  for (int i = 0; i < n; ++i) {
    long long x, y, r;
    cin >> x >> y >> r;
    vec.push_back({x, y, r});
  }
  sort(vec.begin(), vec.end(), comp);
  for (int i = n - 1; i >= 0; --i) {
    for (int j = i - 1; j >= 0; --j) {
      if (i == j) continue;
      if (isInside(vec[i], vec[j])) {
        graph[i].push_back(j);
        isChild[j] = true;
      }
    }
  }
}
void calc(int ind, int sign, double& ans) {
  ans += getArea(vec[ind]) * sign;
  visited[ind] = true;
  for (int i = 0; i < graph[ind].size(); ++i) {
    if (visited[graph[ind][i]]) continue;
    calc(graph[ind][i], sign * -1, ans);
  }
}
void solve() {
  double answer = 0.0000;
  for (int i = 0; i < n; ++i) {
    if (visited[i] || isChild[i]) continue;
    answer += getArea(vec[i]);
    for (int j = 0; j < graph[i].size(); ++j) {
      if (visited[graph[i][j]]) continue;
      calc(graph[i][j], 1, answer);
    }
  }
  printf("%.11f\n", answer);
}
int main() {
  std::ios::sync_with_stdio(false);
  read();
  solve();
  return 0;
}
