#include <bits/stdc++.h>
using namespace std;
const int MAXN = 55, MAXP = MAXN * MAXN, MAXM = MAXP * MAXN * 2, inf = 1e9 + 7;
int n, m, S, T, win[MAXN];
int all = 1, star[MAXP], nxt[MAXM], ent[MAXM], len[MAXM], cost[MAXM];
bool match[MAXN][MAXN];
void Add(int s, int e, int l, int c) {
  nxt[++all] = star[s];
  star[s] = all;
  ent[all] = e;
  len[all] = l;
  cost[all] = c;
  nxt[++all] = star[e];
  star[e] = all;
  ent[all] = s;
  len[all] = 0;
  cost[all] = -c;
}
int dis[MAXP], las[MAXP];
bool In[MAXP];
queue<int> Q;
bool Find_Path() {
  Q.push(S);
  In[S] = 1;
  for (int i = 1; i <= T; i++) dis[i] = inf;
  dis[S] = 0;
  int s, e, ndis;
  while (!Q.empty()) {
    s = Q.front();
    Q.pop();
    In[s] = 0;
    ndis = dis[s];
    for (int edge = star[s]; edge; edge = nxt[edge]) {
      if (len[edge] && dis[e = ent[edge]] > ndis + cost[edge]) {
        dis[e] = ndis + cost[edge];
        las[e] = edge;
        if (!In[e]) {
          In[e] = 1;
          Q.push(e);
        }
      }
    }
  }
  if (dis[T] != inf) return 1;
  return 0;
}
void Add_Flow() {
  int p = T, flow = inf;
  while (p != S) {
    flow = min(flow, len[las[p]]);
    p = ent[las[p] ^ 1];
  }
  p = T;
  while (p != S) {
    len[las[p]] -= flow;
    len[las[p] ^ 1] += flow;
    p = ent[las[p] ^ 1];
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  int w, l;
  S = n * (n + 1) + 1;
  T = S + 1;
  for (int i = 1; i <= m; i++) {
    cin >> w >> l;
    match[w][l] = 1;
    win[w]++;
  }
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++)
      if ((match[i][j] | match[j][i]) == 0) {
        int mch = i * n + j;
        Add(S, mch, 1, 0);
        Add(mch, i, 1, 0);
        Add(mch, j, 1, 0);
      }
  for (int i = 1; i <= n; i++)
    for (int w = win[i]; w <= n - 1; w++) Add(i, T, 1, w << 1 | 1);
  while (Find_Path()) Add_Flow();
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++) {
      int mch = i * n + j, winner, loser;
      for (int edge = star[mch]; edge; edge = nxt[edge])
        if (len[edge] == 0) {
          winner = ent[edge];
          loser = i ^ j ^ winner;
          match[winner][loser] = 1;
        }
    }
  for (int i = 1; i <= n; i++, cout << '\n')
    for (int j = 1; j <= n; j++) cout << match[i][j];
}
