#include <bits/stdc++.h>
using namespace std;
const int maxn = 3005;
struct Edge {
  int u, v;
  long long cap, flow, cost;
};
struct MCMF {
  int n, m, s, t;
  vector<int> G[maxn];
  vector<Edge> E;
  long long d[maxn];
  bool inq[maxn];
  int p[maxn];
  long long a[maxn];
  const long long INF = 1e18 + 7;
  MCMF(int n) : n(n) {}
  void addEdge(int u, int v, long long cap, long long cost) {
    E.push_back({u, v, cap, 0, cost});
    E.push_back({v, u, 0, 0, -cost});
    m = (int)E.size();
    G[u].push_back(m - 2);
    G[v].push_back(m - 1);
  }
  bool BelmanFord(long long &flow, long long &cost) {
    for (int i = 0; i < n; i++) d[i] = INF;
    memset(inq, 0, sizeof(inq));
    d[s] = 0;
    inq[s] = 1;
    p[s] = 0;
    a[s] = INF;
    queue<int> Q;
    Q.push(s);
    while (!Q.empty()) {
      int u = Q.front();
      Q.pop();
      inq[u] = 0;
      for (int i = 0; i < G[u].size(); i++) {
        Edge &e = E[G[u][i]];
        if (e.cap > e.flow && d[e.v] > d[u] + e.cost) {
          d[e.v] = d[u] + e.cost;
          p[e.v] = G[u][i];
          a[e.v] = min(a[u], e.cap - e.flow);
          if (inq[e.v] == 0) {
            Q.push(e.v);
            inq[e.v] = 1;
          }
        }
      }
    }
    if (d[t] == INF) return false;
    flow = a[t];
    cost = d[t];
    int u = t;
    while (u != s) {
      E[p[u]].flow += a[t];
      E[p[u] ^ 1].flow -= a[t];
      u = E[p[u]].u;
    }
    return true;
  }
  pair<long long, long long> Mincost(int s, int t) {
    this->s = s, this->t = t;
    long long Mcost = 0;
    long long Flow = 0;
    long long f = 0;
    long long d = 0;
    while (BelmanFord(f, d)) {
      Flow += f;
      Mcost += f * d;
    }
    return make_pair(Flow, Mcost);
  }
};
const int M = 3000 + 5;
const int K = 55;
int n, m;
int res[K][K];
int getCutu(int u, int v) {
  if (u > v) swap(u, v);
  return (u - 1) * n + v;
}
pair<int, int> ultaCutu(int c) {
  int u = (c + n - 1) / n;
  int v = c - (u - 1) * n;
  return {u, v};
}
int main() {
  scanf("%d %d", &n, &m);
  memset(res, -1, sizeof(res));
  MCMF mcmf(n * n + n + 5);
  int src = 0, snk = n * n + n + 1;
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    mcmf.addEdge(getCutu(u, v), n * n + u, 1, 0);
    res[u][v] = 1, res[v][u] = 0;
  }
  for (int i = 1; i < n; i++) {
    for (int j = i + 1; j <= n; j++) {
      if (res[i][j] == -1) {
        mcmf.addEdge(getCutu(i, j), n * n + i, 1, 0);
        mcmf.addEdge(getCutu(i, j), n * n + j, 1, 0);
      }
      mcmf.addEdge(src, getCutu(i, j), 1, 0);
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) mcmf.addEdge(n * n + i, snk, 1, 2 * j - 1);
  }
  pair<long long, long long> p = mcmf.Mincost(src, snk);
  for (Edge e : mcmf.E) {
    if (e.u > 0 && e.u <= n * n && e.v && e.flow) {
      pair<int, int> mc = ultaCutu(e.u);
      if (mc.first != e.v - n * n) swap(mc.first, mc.second);
      res[mc.first][mc.second] = 1, res[mc.second][mc.first] = 0;
    }
  }
  for (int i = 1; i <= n; i++) res[i][i] = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) printf("%d", res[i][j]);
    printf("\n");
  }
}
