#include <bits/stdc++.h>
using namespace std;
const int N = 1e2 + 10;
const int mod = 1e9 + 7;
int read() {
  int x = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + c - '0', c = getchar();
  return x * f;
}
struct Edge {
  int to, cap, nxt, f;
  Edge() {}
  Edge(int v, int c, int t, int k) : to(v), cap(c), nxt(t), f(k) {}
};
const int EN = 5e3 + 10;
const int EM = 5e4 + 10;
struct MCMF {
  Edge e[EM << 1];
  int head[EN], scnt;
  int f[EN], dis[EN], vis[EN];
  pair<int, int> pre[EN];
  MCMF() { scnt = 1; }
  void addEdge(int u, int v, int w, int k) {
    e[++scnt] = Edge(v, w, head[u], k);
    head[u] = scnt;
    e[++scnt] = Edge(u, 0, head[v], -k);
    head[v] = scnt;
  }
  bool spfa(int s, int t) {
    memset(vis, 0, sizeof(vis));
    memset(dis, 0x3f3f3f3f, sizeof(dis));
    queue<int> q;
    dis[s] = 0;
    vis[s] = 1;
    f[s] = 0x3f3f3f3f;
    q.push(s);
    while (!q.empty()) {
      int x = q.front();
      q.pop();
      vis[x] = 0;
      for (int i = head[x]; i; i = e[i].nxt) {
        int to = e[i].to;
        if (dis[to] > dis[x] + e[i].f && e[i].cap) {
          pre[to] = make_pair(x, i);
          dis[to] = dis[x] + e[i].f;
          f[to] = min(f[x], e[i].cap);
          if (!vis[to]) {
            vis[to] = 1;
            q.push(to);
          }
        }
      }
    }
    return dis[t] != 0x3f3f3f3f;
  }
  pair<int, int> Maxflow(int s, int t) {
    int flow = 0, res = 0;
    while (spfa(s, t)) {
      for (int u = t; u != s; u = pre[u].first) {
        e[pre[u].second].cap -= f[t];
        e[pre[u].second ^ 1].cap += f[t];
        res += e[pre[u].second].f * f[t];
      }
      flow += f[t];
    }
    return make_pair(flow, res);
  }
} mc;
int a[N][N];
vector<pair<int, int> > p;
int main() {
  int n = read(), m = read();
  for (int i = 1; i <= m; i++) {
    int x = read(), y = read();
    a[x][y] = 1;
  }
  int cnt = n;
  int s = ++cnt, t = ++cnt;
  for (int x = 1; x <= n; x++) {
    for (int y = 1; y < x; y++) {
      if (!a[x][y] && !a[y][x]) {
        ++cnt;
        mc.addEdge(s, cnt, 1, 0);
        mc.addEdge(cnt, x, 1, 0);
        mc.addEdge(cnt, y, 1, 0);
        p.push_back(make_pair(mc.scnt - 3, mc.scnt - 1));
      } else if (a[x][y] == 1) {
        mc.addEdge(s, x, 1, 0);
      } else
        mc.addEdge(s, y, 1, 0);
    }
  }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j < n; j++) mc.addEdge(i, t, 1, j - 1);
  mc.Maxflow(s, t);
  for (pair<int, int> now : p) {
    Edge x = mc.e[now.first];
    Edge y = mc.e[now.second];
    if (x.cap == 0)
      a[x.to][y.to] = 1;
    else
      a[y.to][x.to] = 1;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) printf("%d", a[i][j]);
    printf("\n");
  }
}
