#include <bits/stdc++.h>
using namespace std;
namespace mincost {
struct edge {
  int cap, flow, pay;
  int b;
};
const int N = 2600;
const int INF = 1e8;
vector<int> graf[N];
vector<edge> e;
int D[N], Cur[N], Vol[N];
int Pre[N], Eid[N];
void addEdge(int a, int b, int cap, int pay, int flow = 0) {
  graf[a].push_back(e.size());
  e.push_back({cap, flow, pay, b});
  graf[b].push_back(e.size());
  e.push_back({0, 0, -pay, a});
}
bool ford(int n, int s, int t) {
  for (int a = 0; a < n; a++) D[a] = INF;
  D[s] = 0;
  for (int k = 0; k < n; k++) {
    for (int i = 0; i < (int)e.size(); i++)
      if (e[i].cap > e[i].flow) {
        int b = e[i].b, a = e[i ^ 1].b;
        int d = D[a] + e[i].pay;
        if (D[a] == INF || D[b] <= d) continue;
        D[b] = d;
      }
  }
  return (D[t] < INF);
}
bool dijkstra(int n, int s, int t) {
  priority_queue<pair<int, int> > kol;
  kol.push(make_pair(0, s));
  for (int i = 0; i < n; i++) Cur[i] = INF;
  Cur[s] = 0;
  Vol[s] = INF;
  while (!kol.empty()) {
    auto p = kol.top();
    kol.pop();
    if (Cur[p.second] > -p.first) continue;
    int d;
    for (int x : graf[p.second])
      if (e[x].cap > e[x].flow) {
        if ((d = e[x].pay + D[p.second] - D[e[x].b] - p.first) < Cur[e[x].b]) {
          Cur[e[x].b] = d;
          Pre[e[x].b] = p.second;
          Vol[e[x].b] = min(Vol[p.second], e[x].cap - e[x].flow);
          Eid[e[x].b] = x;
          kol.push(make_pair(-d, e[x].b));
        }
      }
  }
  for (int i = 0; i < n; i++) D[i] = Cur[i] + D[i];
  return (D[t] < INF);
}
pair<int, int> flow(int n, int s, int t) {
  pair<int, int> ret = make_pair(0, 0);
  ford(n, s, t);
  while (dijkstra(n, s, t)) {
    int v = t;
    while (v != s) {
      e[Eid[v]].flow += Vol[t];
      e[Eid[v] ^ 1].flow -= Vol[t];
      v = Pre[v];
    }
    ret.first += Vol[t];
    ret.second += D[t] * Vol[t];
  }
  return ret;
}
}  // namespace mincost
const int N = 50;
char tab[N][N];
int edge[N][N];
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) tab[i][j] = '?';
  for (int i = 0; i < m; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    a--;
    b--;
    tab[a][b] = '1';
    tab[b][a] = '0';
  }
  int play = (n * (n - 1)) / 2;
  int mecz = 0, x = 0;
  for (int a = 0; a < n; a++)
    for (int b = 0; b < n; b++) edge[a][b] = -1;
  for (int a = 0; a < n; a++)
    for (int b = 0; b < a; b++) {
      int p = n + 2 + mecz;
      mecz++;
      mincost::addEdge(0, p, 1, 0);
      x += 2;
      if (tab[a][b] != '0') {
        mincost::addEdge(p, a + 2, 1, 0);
        edge[a][b] = x;
        x += 2;
      }
      if (tab[b][a] != '0') {
        mincost::addEdge(p, b + 2, 1, 0);
        edge[b][a] = x;
        x += 2;
      }
    }
  for (int a = 0; a < n; a++)
    for (int b = 1; b < n; b++) {
      mincost::addEdge(a + 2, 1, 1, b * b);
    }
  pair<int, int> res = mincost::flow(n + 2 + play, 0, 1);
  assert(res.first == play);
  for (int a = 0; a < n; a++) {
    for (int b = 0; b < n; b++) {
      if (a == b || edge[a][b] == -1)
        printf("0");
      else if (mincost::e[edge[a][b]].flow == 1)
        printf("1");
      else
        printf("0");
    }
    printf("\n");
  }
}
