#include <bits/stdc++.h>   using namespace std;   const int maxn = 2000;   const int INF = 1e9 + 7;   int le, ri, tot, cpt[60][60], fir[maxn], sec[maxn];   struct MCMF {     struct Edge {       int from, to, cap, cost;       Edge() {}       Edge(int from, int to, int cap, int cost)           : from(from), to(to), cap(cap), cost(cost) {}     };     int n, m, s, t;     vector<Edge> edges;     vector<int> G[maxn];     int inq[maxn];     int d[maxn];     int p[maxn];     int a[maxn];     void init() {       for (int i = 0; i <= n; ++i) G[i].clear();       edges.clear();     }     void AddEdge(int from, int to, int cap, int cost) {       edges.push_back(Edge(from, to, cap, cost));       edges.push_back(Edge(to, from, 0, -cost));       m = edges.size();       G[from].push_back(m - 2);       G[to].push_back(m - 1);     }     bool BF(int& flow, int& cost) {       for (int i = 1; i <= n; ++i) d[i] = INF, inq[i] = 0;       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 = edges[G[u][i]];           if (e.cap && d[e.to] > d[u] + e.cost) {             d[e.to] = d[u] + e.cost;             p[e.to] = G[u][i];             a[e.to] = min(a[u], e.cap);             if (!inq[e.to]) {               Q.push(e.to);               inq[e.to] = 1;             }           }         }       }       if (d[t] == INF) return false;       flow += a[t];       cost += d[t] * a[t];       int u = t;       while (u != s) {         edges[p[u]].cap -= a[t];         edges[p[u] ^ 1].cap += a[t];         u = edges[p[u]].from;       }       return true;     }     int Mincost() {       int flow = 0, cost = 0;       while (BF(flow, cost))         ;       for (int i = le + 1; i < t; ++i) {         if (!edges[G[i][1]].cap)           cpt[fir[i]][sec[i]] = 1, cpt[sec[i]][fir[i]] = 0;         else           cpt[fir[i]][sec[i]] = 0, cpt[sec[i]][fir[i]] = 1;       }       return cost;     }   } NF;   inline int read() {     int x = 0, f = 1;     char ch = getchar();     while (ch <  0  || ch >  9 ) {       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) {       x = (x << 1) + (x << 3) + (ch ^ 48);       ch = getchar();     }     return x;   }   inline void readin() {     int temp, win[60] = {0}, du[60] = {0}, wwin, llos;     le = read(), ri = read();     for (int i = 1; i <= le; ++i)       for (int j = 1; j <= le; ++j)         if (i != j) cpt[i][j] = 2;     NF.s = 0;     temp = le + 1;     for (int i = 1; i <= ri; ++i) {       wwin = read();       llos = read();       cpt[wwin][llos] = 1;       cpt[llos][wwin] = 0;     }     for (int i = 1; i <= le; ++i)       for (int j = 1; j <= le; ++j)         if (cpt[i][j] == 2) {           if (i > j) continue;           fir[temp] = i;           sec[temp] = j;           NF.AddEdge(0, temp, 1, 0);           NF.AddEdge(temp, i, 1, 0);           NF.AddEdge(temp++, j, 1, 0);           ++du[i];           ++du[j];         } else           win[i] += cpt[i][j];     NF.n = NF.t = temp;     for (int i = 1; i <= le; ++i) {       tot += win[i] * win[i];       for (int j = 1; j <= du[i]; ++j)         NF.AddEdge(i, NF.t, 1, 2 * (win[i] + j) - 1);     }   }   int main() {     NF.init();     readin();     int p = NF.Mincost();     for (int i = 1; i <= le; ++i, puts(  ))       for (int j = 1; j <= le; ++j) printf( %d , cpt[i][j]);     return 0;   }