#include //#pragma GCC optimize("O3") //#define int long long using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef vector vi; signed main(){ cin.tie(0); ios::sync_with_stdio(0); int n; cin >> n; vector> a(n); vector r(n); vector> g(n, vector(n)); auto dist2 = [&] (int i, int j) { return (a[i].first - a[j].first) * ll(a[i].first - a[j].first) + (a[i].second - a[j].second) * ll(a[i].second - a[j].second); }; vector ispos(n); vector vis(n); auto check = [&] (int i) { int sz = 0, pos = 0; bool good = true; queue q; q.push(i); ispos[i] = true; while (q.size()) { int u = q.front(); q.pop(); pos += ispos[u]; ++sz; for (int i = 0; i < n; ++i) if (g[u][i]) { if (!vis[i]) { q.push(i); ispos[i] = !ispos[u]; vis[i] = true; } if (vis[i] && ispos[i] == ispos[u]) good = false; } } return good && 2 * pos != sz; }; int ii = 0; for (auto&[x, y] : a) cin >> x >> y >> r[ii++]; for (int i = 0; i < n; ++i) for (int j = i + 1; j < n; ++j) if (dist2(i, j) == ll(r[i] + r[j]) * (r[i] + r[j])) g[i][j] = true; for (int i = 0; i < n; ++i) if (!vis[i]) { if (check(i)) { cout << "YES\n"; return 0; } } cout << "NO\n"; }