#include <bits/stdc++.h>
using namespace std;
inline int add(int _a, int _b) {
  if (_a < 0) {
    _a += 1000000007;
  }
  if (_b < 0) {
    _b += 1000000007;
  }
  if (_a + _b >= 1000000007) {
    return _a + _b - 1000000007;
  }
  return _a + _b;
}
inline int mul(int _a, int _b) {
  if (_a < 0) {
    _a += 1000000007;
  }
  if (_b < 0) {
    _b += 1000000007;
  }
  return ((long long int)((long long int)_a * (long long int)_b)) % 1000000007;
}
namespace mcmf {
const int MAX = 1000010;
const long long INF = 1LL << 60;
long long cap[MAX], flow[MAX], cost[MAX], dis[MAX];
int n, m, s, t, Q[10000010], adj[MAX], link[MAX], last[MAX], from[MAX],
    visited[MAX];
void init(int nodes, int source, int sink) {
  m = 0, n = nodes, s = source, t = sink;
  for (int i = 0; i <= n; i++) last[i] = -1;
}
void add_edge(int u, int v, long long c, long long w) {
  adj[m] = v, cap[m] = c, flow[m] = 0, cost[m] = +w, link[m] = last[u],
  last[u] = m++;
  adj[m] = u, cap[m] = 0, flow[m] = 0, cost[m] = -w, link[m] = last[v],
  last[v] = m++;
}
bool spfa() {
  int i, j, x, f = 0, l = 0;
  for (i = 0; i <= n; i++) visited[i] = 0, dis[i] = INF;
  dis[s] = 0, Q[l++] = s;
  while (f < l) {
    i = Q[f++];
    for (j = last[i]; j != -1; j = link[j]) {
      if (flow[j] < cap[j]) {
        x = adj[j];
        if (dis[x] > dis[i] + cost[j]) {
          dis[x] = dis[i] + cost[j], from[x] = j;
          if (!visited[x]) {
            visited[x] = 1;
            if (f && rand() & 7)
              Q[--f] = x;
            else
              Q[l++] = x;
          }
        }
      }
    }
    visited[i] = 0;
  }
  return (dis[t] != INF);
}
pair<long long, long long> solve() {
  int i, j;
  long long mincost = 0, maxflow = 0;
  while (spfa()) {
    long long aug = INF;
    for (i = t, j = from[i]; i != s; i = adj[j ^ 1], j = from[i]) {
      aug = min(aug, cap[j] - flow[j]);
    }
    for (i = t, j = from[i]; i != s; i = adj[j ^ 1], j = from[i]) {
      flow[j] += aug, flow[j ^ 1] -= aug;
    }
    maxflow += aug, mincost += aug * dis[t];
  }
  return make_pair(mincost, maxflow);
}
}  // namespace mcmf
const int N = 50;
int n, m, nd_cnt = 0, match[N + 5][N + 5], player[N + 5], win[N + 5];
pair<int, int> edge[N * N + 5];
bool already[N + 5][N + 5], graph[N + 5][N + 5];
int edge_idx[N + 5][N + 5][2];
void solve() {
  int i, j;
  for (i = 0; i < m; i++) {
    already[edge[i].first][edge[i].second] = 1;
    already[edge[i].second][edge[i].first] = 1;
    win[edge[i].first]++;
  }
  nd_cnt++;
  for (i = 0; i < n; i++)
    for (j = i + 1; j < n; ++j)
      if (!already[i][j]) match[i][j] = nd_cnt++;
  for (i = 0; i < n; i++) player[i] = nd_cnt++;
  nd_cnt++;
  mcmf ::init(nd_cnt, 0, nd_cnt - 1);
  for (i = 0; i < n; i++)
    for (j = i + 1; j < n; ++j)
      if (!already[i][j]) {
        mcmf ::add_edge(0, match[i][j], 1, 0);
        edge_idx[i][j][0] = mcmf ::m,
        mcmf ::add_edge(match[i][j], player[i], 1, 0);
        edge_idx[i][j][1] = mcmf ::m,
        mcmf ::add_edge(match[i][j], player[j], 1, 0);
      }
  for (i = 0; i < n; i++)
    for (j = win[i]; j < n - 1; ++j) {
      mcmf ::add_edge(player[i], nd_cnt - 1, 1, 2 * j + 1);
    }
  pair<long long int, long long int> sol = mcmf ::solve();
  for (i = 0; i < n; i++)
    for (j = i + 1; j < n; ++j)
      if (!already[i][j]) {
        int x = edge_idx[i][j][0], y = edge_idx[i][j][1];
        if (mcmf ::flow[x])
          graph[i][j] = 1;
        else if (mcmf ::flow[y])
          graph[j][i] = 1;
      }
  for (i = 0; i < m; i++) graph[edge[i].first][edge[i].second] = 1;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      printf("%d", graph[i][j]);
    }
    puts("");
  }
}
int main() {
  int i, j;
  scanf("%d %d", &n, &m);
  for (i = 0; i < m; i++)
    scanf("%d %d", &edge[i].first, &edge[i].second), --edge[i].first,
        --edge[i].second;
  solve();
}
