#include #include #include #include using namespace std; typedef int LL; struct Edge { int u, v; LL cap, flow; Edge() {} Edge(int u, int v, LL cap): u(u), v(v), cap(cap), flow(0) {} }; struct Dinic { int N; vector E; vector> g; vector d, pt; Dinic(int N): N(N), E(0), g(N), d(N), pt(N) {} void AddEdge(int u, int v, LL cap) { if (u != v) { E.emplace_back(u, v, cap); g[u].emplace_back(E.size() - 1); E.emplace_back(v, u, 0); g[v].emplace_back(E.size() - 1); } } bool BFS(int S, int T) { queue q({S}); fill(d.begin(), d.end(), N + 1); d[S] = 0; while(!q.empty()) { int u = q.front(); q.pop(); if (u == T) break; for (int k: g[u]) { Edge &e = E[k]; if (e.flow < e.cap && d[e.v] > d[e.u] + 1) { d[e.v] = d[e.u] + 1; q.emplace(e.v); } } } return d[T] != N + 1; } LL DFS(int u, int T, LL flow = -1) { if (u == T || flow == 0) return flow; for (int &i = pt[u]; i < g[u].size(); ++i) { Edge &e = E[g[u][i]]; Edge &oe = E[g[u][i]^1]; if (d[e.v] == d[e.u] + 1) { LL amt = e.cap - e.flow; if (flow != -1 && amt > flow) amt = flow; if (LL pushed = DFS(e.v, T, amt)) { e.flow += pushed; oe.flow -= pushed; return pushed; } } } return 0; } LL MaxFlow(int S, int T) { LL total = 0; while (BFS(S, T)) { fill(pt.begin(), pt.end(), 0); while (LL flow = DFS(S, T)) total += flow; } return total; } }; Dinic* dinic; int main() { int n, m; cin >> n >> m; int src = 2*n; int snk = 2*n+1; dinic = new Dinic(2*n+2); for(int i = 0; i < n; i++) { dinic->AddEdge(src, i, 5000); dinic->AddEdge(i+n, snk, 5000); } while(m--) { int a, b; cin >> a >> b; a--; b--; dinic->AddEdge(a, b+n, 5000); dinic->AddEdge(b, a+n, 5000); } int amt = dinic->MaxFlow(src, snk); if(amt != 5000*n) return void(cout << "-1\n"), 0; vector> ret(n); for(auto& x: ret) x.resize(n); for(int i = 0; i < n; i++) { for(auto out: dinic->g[i]) { Edge e = dinic->E[out]; if(e.v != src && e.v != snk && e.v >= n && e.v < 2*n) { ret[i][e.v-n] += e.flow; ret[e.v-n][i] += e.flow; } } } for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) cout << ret[i][j] << " \n"[j==n-1]; }