#include <bits/stdc++.h>
using namespace std;
const int M = 1000000007;
const int MM = 998244353;
const long double PI = acos(-1);
long long power(long long b, long long e, long long m) {
  if (e == 0) return 1;
  if (e & 1) return b * power(b * b % m, e / 2, m) % m;
  return power(b * b % m, e / 2, m);
}
long long power(long long b, long long e) {
  if (e == 0) return 1;
  if (e & 1) return b * power(b * b, e / 2);
  return power(b * b, e / 2);
}
template <typename T, typename U>
static inline void amin(T &x, U y) {
  if (y < x) x = y;
}
template <typename T, typename U>
static inline void amax(T &x, U y) {
  if (x < y) x = y;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  return os << '(' << p.first << "," << p.second << ')';
}
const int N = 2505;
bitset<2501> row[N], col[N];
int a[N][N];
int _runtimeTerror_() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j) cin >> a[i][j];
  vector<pair<int, int> > v;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      if ((i == j && a[i][j]) || (a[i][j] != a[j][i])) {
        cout << "NOT MAGIC\n";
        return 0;
      }
      v.push_back({i, j});
    }
  }
  sort(v.begin(), v.end(), [&](pair<int, int> x, pair<int, int> y) {
    return a[x.first][x.second] > a[y.first][y.second];
  });
  auto check = [&](int i, int j) {
    int x = (row[i] | col[j]).count();
    return x == n;
  };
  int i = 0, j = 0;
  while (j < n * n) {
    while (j < n * n &&
           a[v[j].first][v[j].second] == a[v[i].first][v[i].second]) {
      row[v[j].first][v[j].second] = 1, col[v[j].second][v[j].first] = 1;
      ++j;
    }
    while (i < j) {
      if (!check(v[i].first, v[i].second)) {
        cout << "NOT MAGIC\n";
        return 0;
      }
      ++i;
    }
  }
  cout << "MAGIC\n";
  return 0;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int TESTS = 1;
  while (TESTS--) _runtimeTerror_();
  return 0;
}
