#include <bits/stdc++.h>
using namespace std;
int n, m;
int st, en;
struct edge {
  int u, v, cap, flow;
  edge(int _u = 0, int _v = 0, int _cap = 0, int _flow = 0)
      : u(_u), v(_v), cap(_cap), flow(_flow){};
};
vector<int> g[5000];
vector<edge> e;
void addEdge(int u, int v, int cap) {
  g[u].push_back(e.size());
  e.push_back(edge(u, v, cap, 0));
  g[v].push_back(e.size());
  e.push_back(edge(v, u, 0, 0));
}
int d[5000], pa[5000];
int dijkstra() {
  fill(d, d + en + 1, 100000000);
  fill(pa, pa + en + 1, -1);
  priority_queue<pair<int, int> > q;
  d[st] = 0;
  q.push({-d[st], st});
  while (!q.empty()) {
    int u = q.top().second;
    q.pop();
    for (auto id : g[u]) {
      int v = e[id].v;
      if (e[id].cap == e[id].flow) continue;
      int cost = (v == en ? e[id].flow : 0);
      if (d[v] > d[u] + cost) {
        d[v] = d[u] + cost;
        pa[v] = id;
        q.push({-d[v], v});
      }
    }
  }
  for (int id = pa[en]; id != -1; id = pa[e[id].u]) {
    e[id].flow++;
    e[id ^ 1].flow--;
  }
  return d[en];
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n >> m;
  vector<vector<int> > a(n + 1, vector<int>(n + 1, 0));
  for (int i = 0; i < m; ++i) {
    int u, v;
    cin >> u >> v;
    a[u][v] = 1;
    a[v][u] = -1;
  }
  vector<vector<int> > tr(n + 1, vector<int>(n + 1, 0));
  st = 0;
  en = n + 1;
  for (int i = 1; i <= n; ++i)
    for (int j = i + 1; j <= n; ++j)
      if (a[i][j] == 0) {
        addEdge(st, en, 1);
        int id = e.size();
        addEdge(en, i, 1);
        addEdge(en, j, 1);
        tr[i][j] = id;
        en++;
      } else
        addEdge(st, (a[i][j] == 1 ? i : j), 1);
  for (int i = 1; i <= n; ++i) addEdge(i, en, n * n);
  while (dijkstra() != 100000000)
    ;
  for (int i = 1; i <= n; ++i)
    for (int j = i + 1; j <= n; ++j)
      if (a[i][j] == 0) {
        a[i][j] = (e[tr[i][j]].flow ? 1 : -1);
        a[j][i] = -a[i][j];
      }
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) cout << (a[i][j] + 1) / 2;
    cout << '\n';
  }
  return 0;
}
