#include <bits/stdc++.h>
using namespace std;
const int N = 55;
struct Edge {
  int x, y, f, c, next;
} edge[N * N * 8];
int tot, n, m, ans;
int idP[N], idE[N][N], flag[N][N], G[N][N];
int son[N * N * 2], dis[N * N * 2], vis[N * N * 2], pre[N * N * 2];
inline void add(int x, int y, int f, int c) {
  edge[++tot].x = x;
  edge[tot].y = y;
  edge[tot].f = f;
  edge[tot].c = c;
  edge[tot].next = son[x];
  son[x] = tot;
  edge[++tot].x = y;
  edge[tot].y = x;
  edge[tot].f = 0;
  edge[tot].c = -c;
  edge[tot].next = son[y];
  son[y] = tot;
}
queue<int> q;
int SPFA(int st, int ed) {
  memset(dis, 0x3f, sizeof(dis));
  dis[st] = 0;
  vis[st] = 1;
  q.push(st);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = son[x]; i != -1; i = edge[i].next)
      if (edge[i].f) {
        int y = edge[i].y;
        if (dis[x] + edge[i].c < dis[y]) {
          dis[y] = dis[x] + edge[i].c;
          pre[y] = i;
          if (!vis[y]) {
            q.push(y);
            vis[y] = 1;
          }
        }
      }
    vis[x] = 0;
  }
  return dis[ed] != 0x3f3f3f3f;
}
void update(int st, int ed) {
  int flow = 0x3f3f3f3f;
  for (int x = ed; x != st; x = edge[pre[x]].x)
    flow = min(flow, edge[pre[x]].f);
  for (int x = ed; x != st; x = edge[pre[x]].x)
    edge[pre[x]].f -= flow, edge[pre[x] ^ 1].f += flow;
  ans += flow * dis[ed];
}
void mincost(int st, int ed) {
  while (SPFA(st, ed)) {
    update(st, ed);
  }
}
int main() {
  scanf("%d%d", &n, &m);
  tot = -1;
  memset(son, -1, sizeof(son));
  int S = 1, cnt = 1;
  for (int i = 1; i <= n; i++) {
    idP[i] = ++cnt;
  }
  for (int i = 1; i < n; i++)
    for (int j = i + 1; j <= n; j++) {
      idE[i][j] = ++cnt;
      add(S, idE[i][j], 1, 0);
    }
  int T = ++cnt;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < n - 1; j++) {
      add(idP[i], T, 1, j);
    }
  }
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    int u = x;
    if (x > y) swap(x, y);
    add(idE[x][y], idP[u], 1, 0);
    flag[x][y] = 1;
  }
  for (int x = 1; x < n; x++)
    for (int y = x + 1; y <= n; y++) {
      if (flag[x][y]) continue;
      add(idE[x][y], idP[x], 1, 0);
      add(idE[x][y], idP[y], 1, 0);
    }
  mincost(S, T);
  for (int i = 1; i < n; i++)
    for (int j = i + 1; j <= n; j++) {
      int x = idE[i][j];
      for (int e = son[x]; e != -1; e = edge[e].next) {
        int y = edge[e].y;
        if (y >= idP[1] && y <= idP[n] && edge[e].f == 0) {
          G[y - 1][i + j - y + 1] = 1;
        }
      }
    }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) printf("%d", G[i][j]);
    puts("");
  }
}
