#include <bits/stdc++.h>
using namespace std;
using INT = long long;
struct edge {
  int to, capacity, cost, rev;
  edge() {}
  edge(int to, int _capacity, int _cost, int _rev)
      : to(to), capacity(_capacity), cost(_cost), rev(_rev) {}
};
const int inf = 0x3f3f3f3f;
using pii = pair<int, int>;
struct Min_Cost_Max_Flow {
  int V, H[1550 + 5], dis[1550 + 5], PreV[1550 + 5], PreE[1550 + 5];
  vector<edge> G[1550 + 5];
  void Init(int n) {
    V = n;
    for (int i = 0; i <= V; ++i) G[i].clear();
  }
  void add_edge(int from, int to, int cap, int cost) {
    G[from].push_back(edge(to, cap, cost, G[to].size()));
    G[to].push_back(edge(from, 0, -cost, G[from].size() - 1));
  }
  int minCost(int s, int t, int f) {
    int flow = 0;
    int res = 0;
    fill(H, H + 1 + V, 0);
    while (f) {
      priority_queue<pii, vector<pii>, greater<pii> > q;
      fill(dis, dis + 1 + V, inf);
      dis[s] = 0;
      q.push(pii(0, s));
      while (!q.empty()) {
        pii now = q.top();
        q.pop();
        int v = now.second;
        if (dis[v] < now.first) continue;
        for (int i = 0; i < G[v].size(); ++i) {
          edge& e = G[v][i];
          if (e.capacity > 0 && dis[e.to] > dis[v] + e.cost + H[v] - H[e.to]) {
            dis[e.to] = dis[v] + e.cost + H[v] - H[e.to];
            PreV[e.to] = v;
            PreE[e.to] = i;
            q.push(pii(dis[e.to], e.to));
          }
        }
      }
      if (dis[t] == inf) break;
      for (int i = 0; i <= V; ++i) H[i] += dis[i];
      int d = f;
      for (int v = t; v != s; v = PreV[v])
        d = min(d, G[PreV[v]][PreE[v]].capacity);
      f -= d;
      flow += d;
      res += d * H[t];
      for (int v = t; v != s; v = PreV[v]) {
        edge& e = G[PreV[v]][PreE[v]];
        e.capacity -= d;
        G[v][e.rev].capacity += d;
      }
    }
    return res;
  }
} mcmf;
int mat[55][55], deg[55], id[55][55];
int nn;
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    mat[u][v] = 1;
    deg[u]++;
  }
  mcmf.Init(n * (n - 1) / 2 - m + n + 3);
  int src = n + 1, tar = n + 2;
  nn = n + 2;
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++)
      if (mat[i][j] + mat[j][i] == 0) {
        id[i][j] = id[j][i] = ++nn;
        mcmf.add_edge(src, nn, 1, 0);
        mcmf.add_edge(nn, i, 1, 0);
        mcmf.add_edge(nn, j, 1, 0);
      }
  for (int i = 1; i <= n; i++) {
    for (int j = deg[i] + 1; j < n; j++) {
      mcmf.add_edge(i, tar, 1, j - 1);
    }
  }
  mcmf.minCost(src, tar, n * (n - 1) / 2 - m);
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++)
      if (mat[i][j] + mat[j][i] == 0) {
        for (edge x : mcmf.G[id[i][j]])
          if (x.to == i) {
            if (x.capacity)
              mat[j][i] = 1;
            else
              mat[i][j] = 1;
            break;
          }
      }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) printf("%d", mat[i][j]);
    puts("");
  }
  return 0;
}
