#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
const double pi = acos(-1);
int sign(double k) {
  if (k > eps)
    return 1;
  else if (k < -eps)
    return -1;
  return 0;
}
int cmp(double k1, double k2) { return sign(k1 - k2); }
int inmid(double k1, double k2, double k3) {
  return sign(k1 - k3) * sign(k2 - k3) <= 0;
}
struct point {
  double x, y;
  point operator+(const point &k1) const { return (point){k1.x + x, k1.y + y}; }
  point operator-(const point &k1) const { return (point){x - k1.x, y - k1.y}; }
  point operator*(double k1) const { return (point){x * k1, y * k1}; }
  point operator/(double k1) const { return (point){x / k1, y / k1}; }
  int operator==(const point &k1) const {
    return cmp(x, k1.x) == 0 && cmp(y, k1.y) == 0;
  }
  point turn(double k1) {
    return (point){x * cos(k1) - y * sin(k1), x * sin(k1) + y * cos(k1)};
  }
  point turn90() { return (point){-y, x}; }
  bool operator<(const point k1) const {
    int a = cmp(x, k1.x);
    if (a == -1)
      return 1;
    else if (a == 1)
      return 0;
    else
      return cmp(y, k1.y) == -1;
  }
  double abs() { return sqrt(x * x + y * y); }
  double abs2() { return x * x + y * y; }
  double dis(point k1) { return ((*this) - k1).abs(); }
  point unit() {
    double w = abs();
    return (point){x / w, y / w};
  }
  void scan() {
    double k1, k2;
    scanf("%lf%lf", &k1, &k2);
    x = k1;
    y = k2;
  }
  void print() { printf("%.11lf %.11lf\n", x, y); }
  double getw() { return atan2(y, x); }
  point getdel() {
    if (sign(x) == -1 || (sign(x) == 0 && sign(y) == -1))
      return (*this) * (-1);
    else
      return (*this);
  }
  int getP() const { return sign(y) == 1 || (sign(y) == 0 && sign(x) == -1); }
};
int inmid(point k1, point k2, point k3) {
  return inmid(k1.x, k2.x, k3.x) && inmid(k1.y, k2.y, k3.y);
}
double cross(point k1, point k2) { return k1.x * k2.y - k1.y * k2.x; }
double dot(point k1, point k2) { return k1.x * k2.x + k1.y * k2.y; }
double rad(point k1, point k2) { return atan2(cross(k1, k2), dot(k1, k2)); }
int compareangle(point k1, point k2) {
  return k1.getP() < k2.getP() ||
         (k1.getP() == k2.getP() && sign(cross(k1, k2)) > 0);
}
point proj(point k1, point k2, point q) {
  point k = k2 - k1;
  return k1 + k * (dot(q - k1, k) / k.abs2());
}
point reflect(point k1, point k2, point q) { return proj(k1, k2, q) * 2 - q; }
int clockwise(point k1, point k2, point k3) {
  return sign(cross(k2 - k1, k3 - k1));
}
int checkLL(point k1, point k2, point k3, point k4) {
  return cmp(cross(k3 - k1, k4 - k1), cross(k3 - k2, k4 - k2)) != 0;
}
point getLL(point k1, point k2, point k3, point k4) {
  double w1 = cross(k1 - k3, k4 - k3), w2 = cross(k4 - k3, k2 - k3);
  return (k1 * w2 + k2 * w1) / (w1 + w2);
}
int intersect(double l1, double r1, double l2, double r2) {
  if (l1 > r1) swap(l1, r1);
  if (l2 > r2) swap(l2, r2);
  return cmp(r1, l2) != -1 && cmp(r2, l1) != -1;
}
int checkSS(point k1, point k2, point k3, point k4) {
  return intersect(k1.x, k2.x, k3.x, k4.x) &&
         intersect(k1.y, k2.y, k3.y, k4.y) &&
         sign(cross(k3 - k1, k4 - k1)) * sign(cross(k3 - k2, k4 - k2)) <= 0 &&
         sign(cross(k1 - k3, k2 - k3)) * sign(cross(k1 - k4, k2 - k4)) <= 0;
}
double disSP(point k1, point k2, point q) {
  point k3 = proj(k1, k2, q);
  if (inmid(k1, k2, k3))
    return q.dis(k3);
  else
    return min(q.dis(k1), q.dis(k2));
}
double disSS(point k1, point k2, point k3, point k4) {
  if (checkSS(k1, k2, k3, k4))
    return 0;
  else
    return min(min(disSP(k1, k2, k3), disSP(k1, k2, k4)),
               min(disSP(k3, k4, k1), disSP(k3, k4, k2)));
}
int onS(point k1, point k2, point q) {
  return inmid(k1, k2, q) && sign(cross(k1 - q, k2 - k1)) == 0;
}
struct circle {
  point o;
  double r;
  void scan() {
    o.scan();
    scanf("%lf", &r);
  }
  int inside(point k) { return cmp(r, o.dis(k)); }
};
int checkposCC(circle k1, circle k2) {
  if (cmp(k1.r, k2.r) == -1) swap(k1, k2);
  double dis = k1.o.dis(k2.o);
  int w1 = cmp(dis, k1.r + k2.r), w2 = cmp(dis, k1.r - k2.r);
  if (w1 > 0)
    return 4;
  else if (w1 == 0)
    return 3;
  else if (w2 > 0)
    return 2;
  else if (w2 == 0)
    return 1;
  else
    return 0;
}
vector<point> getCC(circle k1, circle k2) {
  int pd = checkposCC(k1, k2);
  if (pd == 0 || pd == 4) return {};
  double a = (k2.o - k1.o).abs2(),
         cosA = (k1.r * k1.r + a - k2.r * k2.r) /
                (2 * k1.r * sqrt(max(a, (double)0.0)));
  double b = k1.r * cosA, c = sqrt(max((double)0.0, k1.r * k1.r - b * b));
  point k = (k2.o - k1.o).unit(), m = k1.o + k * b, del = k.turn90() * c;
  return {m - del, m + del};
}
int n, cnt[5];
circle c[3];
set<point> s;
vector<point> v;
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%lf%lf%lf", &c[i].o.x, &c[i].o.y, &c[i].r);
  }
  int p = 0;
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      v = getCC(c[i], c[j]);
      if (v.size()) p++;
      for (auto t : v) s.insert(t);
    }
  }
  int e, v;
  v = s.size();
  for (int i = 0; i < n; i++) {
    for (auto x : s) {
      if (c[i].inside(x) == 0) e++;
    }
  }
  p = max(1, n - p);
  cout << e - v + 1 + p << endl;
}
