#include <bits/stdc++.h>   using namespace std;   const int N = 2501;   mt19937 rng(std::chrono::system_clock::now().time_since_epoch().count());   int n, p[2 * N], a[N][N], cur;   void no() {     puts( NOT MAGIC );     exit(0);   }   struct edge {     int u, v, w;     edge(int a = 0, int b = 0, int c = 0) {       u = a;       v = b;       w = c;     }     bool operator<(const edge &a) const { return w < a.w; }   };   int get(int u) { return u == p[u] ? u : p[u] = get(p[u]); }   vector<edge> e;   vector<pair<int, int>> g[2 * N];   void dfs(int u, int p, int mx) {     if (u >= n && a[cur][u - n] > mx) no();     for (auto i : g[u])       if (i.first != p) dfs(i.first, u, max(mx, i.second));   }   int main() {     for (int i = 0; i < 2 * N; i++) p[i] = i;     scanf( %d , &n);     for (int i = 0; i < n; i++)       for (int j = 0; j < n; j++) {         scanf( %d , &a[i][j]);         e.push_back(edge(i, n + j, a[i][j]));       }     for (int i = 0; i < n; i++)       for (int j = 0; j < n; j++) {         if (a[i][j] != a[j][i] || i == j && a[i][j]) no();       }     sort(e.begin(), e.end());     for (auto i : e) {       int a = get(i.u);       int b = get(i.v);       if (a != b) {         p[a] = b;         g[i.u].push_back({i.v, i.w});         g[i.v].push_back({i.u, i.w});       }     }     for (int i = 0; i < n; i++) {       cur = i;       dfs(i, -1, 0);     }     puts( MAGIC );   }   