#include <bits/stdc++.h>
using namespace std;
const long long INF = (long long)1e9 + 5;
const long long MOD = (long long)1e9 + 7;
const int MAXN = 55;
struct Min_cost_flow {
  static const int MAXV = 50 * 50 + 50 + 5;
  struct Edge {
    int to, cap;
    int cost, rev;
  };
  int V, E;
  vector<Edge> G[MAXV];
  pair<int, int> pre[MAXV];
  int flow[MAXV], dist[MAXV];
  bool inque[MAXV];
  void init(int _V) {
    V = _V;
    for (int i = 0; i <= V; i++) G[i].clear();
  }
  pair<int, int> add_edge(int fr, int to, int cap, int cost) {
    int a = G[fr].size(), b = G[to].size();
    G[fr].push_back({to, cap, cost, b});
    G[to].push_back({fr, 0, -cost, a});
    return make_pair(fr, (int)G[fr].size() - 1);
  }
  bool SPFA(int second, int t, int &ans_flow, int &ans_cost) {
    queue<int> que;
    for (int i = 0; i <= V; i++) {
      dist[i] = INF;
      inque[i] = false;
    }
    dist[second] = 0;
    flow[second] = INF;
    inque[second] = true;
    que.push(second);
    while (!que.empty()) {
      int v = que.front();
      que.pop();
      inque[v] = false;
      for (int i = 0; i < G[v].size(); i++) {
        const Edge &e = G[v][i];
        if (e.cap > 0 && dist[v] + e.cost < dist[e.to]) {
          flow[e.to] = min(flow[v], e.cap);
          dist[e.to] = dist[v] + e.cost;
          pre[e.to] = {v, i};
          if (!inque[e.to]) que.push(e.to), inque[e.to] = true;
        }
      }
    }
    if (dist[t] == INF) return false;
    int v = t, first = flow[t];
    ans_flow += flow[t];
    ans_cost += (dist[t] * flow[t]);
    while (v != second) {
      Edge &e = G[pre[v].first][pre[v].second];
      e.cap -= first;
      G[v][e.rev].cap += first;
      v = pre[v].first;
    }
    return true;
  }
  pair<int, int> mcmf(int second, int t) {
    int ans_flow = 0, ans_cost = 0;
    while (SPFA(second, t, ans_flow, ans_cost))
      ;
    return make_pair(ans_flow, ans_cost);
  }
} algo;
int n, m, cnt[MAXN], first[MAXN], fix[MAXN][MAXN], win[MAXN][MAXN];
pair<int, int> e[MAXN][MAXN];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  for (int i = 0; i < MAXN; i++) {
    first[i] = i * (i - 1) / 2;
  }
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    fix[u][v] = fix[v][u] = win[u][v] = 1;
    cnt[u]++;
  }
  int src = 0, n1 = n * (n - 1) / 2, tgt = n1 + n + 1, id = 0,
      ans = n * (n - 1) * (n - 2) / 6;
  algo.init(tgt + 1);
  for (int u = 1; u <= n; u++) {
    for (int v = 1; v < u; v++) {
      id++;
      if (fix[u][v]) continue;
      algo.add_edge(src, id, 1, 0);
      e[u][v] = algo.add_edge(id, n1 + u, 1, 0);
      e[v][u] = algo.add_edge(id, n1 + v, 1, 0);
    }
  }
  for (int i = 1; i <= n; i++) {
    ans -= cnt[i] * (cnt[i] - 1) / 2;
    for (int j = cnt[i] + 1; j <= n - 1; j++) {
      algo.add_edge(n1 + i, tgt, 1, first[j] - first[j - 1]);
    }
  }
  pair<int, int> p = algo.mcmf(src, tgt);
  for (int u = 1; u <= n; u++) {
    for (int v = 1; v <= n; v++) {
      if (u == v || fix[u][v]) continue;
      int i1 = e[u][v].first, i2 = e[u][v].second;
      win[u][v] = (algo.G[i1][i2].cap == 0);
    }
  }
  for (int u = 1; u <= n; u++) {
    for (int v = 1; v <= n; v++) {
      cout << win[u][v];
    }
    cout << '\n';
  }
  return 0;
}
