#include <bits/stdc++.h>
using namespace std;
const int __SIZE = 1 << 18;
char ibuf[__SIZE], *iS, *iT;
template <typename T>
inline void read(T &x) {
  char ch, t = 0;
  x = 0;
  while (!isdigit(ch = (iS == iT
                            ? (iT = (iS = ibuf) + fread(ibuf, 1, __SIZE, stdin),
                               (iS == iT ? EOF : *iS++))
                            : *iS++)))
    t |= ch == '-';
  while (isdigit(ch))
    x = x * 10 + (ch ^ 48),
    ch = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, __SIZE, stdin),
                      (iS == iT ? EOF : *iS++))
                   : *iS++);
  x = t ? -x : x;
}
inline int read_int() {
  int x;
  return read(x), x;
}
inline long long read_ll() {
  long long x;
  return read(x), x;
}
template <typename T>
inline void chkmin(T &a, T b) {
  a = a < b ? a : b;
}
template <typename T>
inline void chkmax(T &a, T b) {
  a = a > b ? a : b;
}
int d[110];
int id[110][110];
int res[110][110];
int tot = 1;
int fi[20010];
int ne[500010];
int to[500010];
int fl[500010];
int co[500010];
inline void Link(int u, int v, int f, int c) {
  tot++;
  to[tot] = v;
  fl[tot] = f;
  co[tot] = c;
  ne[tot] = fi[u];
  fi[u] = tot;
}
inline void AddEdge(int u, int v, int f, int c) {
  Link(u, v, f, c), Link(v, u, 0, -c);
}
int la[20010];
int dis[20010];
inline int BFS(int S, int T) {
  memset(la, 0, sizeof(la));
  memset(dis, 127, sizeof(dis));
  dis[S] = 0;
  queue<int> q;
  q.push(S);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = fi[x]; i; i = ne[i]) {
      int u = to[i];
      if (fl[i] && dis[u] > dis[x] + co[i]) {
        dis[u] = dis[x] + co[i];
        la[u] = i ^ 1;
        q.push(u);
      }
    }
  }
  return dis[T] < dis[0];
}
inline int MCMF(int S, int T) {
  int Co = 0, flow = 0;
  while (BFS(S, T)) {
    Co += dis[T], ++flow;
    int x = T, e = 0;
    while (x != S) {
      e = la[x];
      fl[e]++;
      fl[e ^ 1]--;
      x = to[e];
    }
  }
  return cerr << flow << endl, Co;
}
int main() {
  int n = read_int(), m = read_int();
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      if (i != j) res[i][j] = 2;
  for (int i = 1; i <= m; i++) {
    int u = read_int(), v = read_int();
    res[u][v] = 1;
    res[v][u] = 0;
  }
  int mx = (n - 1) * n * (n + 1) / 6, sum = 0;
  int S = 1, T = 2, N = 2;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) d[i] += res[i][j] == 1;
  for (int i = 1; i <= n; i++) sum += d[i] * d[i];
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      id[i][j] = ++N;
      if (j > 1) AddEdge(id[i][j - 1], N, n, 2);
      if (j > d[i]) AddEdge(N, T, 1, 1);
    }
  }
  int st = N + 1, ed = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j++) {
      if (res[i][j] == 2) {
        ++N;
        AddEdge(S, N, 1, 0);
        AddEdge(N, id[i][1], 1, 0);
        AddEdge(N, id[j][1], 1, 0);
      }
    }
  }
  ed = N, sum += MCMF(S, T);
  for (int i = st; i <= ed; i++) {
    int u = 0, v = 0, tag = 0;
    for (int k = fi[i]; k; k = ne[k]) {
      int x = to[k];
      if (x == S) continue;
      (u ? v : u) = x;
      if (!fl[k]) tag = x == u;
    }
    u = (u - 3) / n + 1, v = (v - 3) / n + 1;
    if (tag)
      res[u][v] = 1, res[v][u] = 0;
    else
      res[v][u] = 1, res[u][v] = 0;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) putchar(res[i][j] | 48);
    puts("");
  }
  return 0;
}
