package main
import (
"bufio"
"fmt"
"os"
)
const MOD = 998244353
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var n, m int
if _, err := fmt.Fscan(reader, &n, &m); err != nil {
return
}
adj := make([][]int, n+1)
for i := 0; i < m; i++ {
var u, v int
fmt.Fscan(reader, &u, &v)
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
D := make([][]int, n+1)
for i := 1; i <= n; i++ {
D[i] = make([]int, n+1)
for j := 1; j <= n; j++ {
D[i][j] = -1
}
D[i][i] = 0
q := []int{i}
for len(q) > 0 {
u := q[0]
q = q[1:]
for _, v := range adj[u] {
if D[i][v] == -1 {
D[i][v] = D[i][u] + 1
q = append(q, v)
}
}
}
}
parents := make([][][]int, n+1)
for i := 1; i <= n; i++ {
parents[i] = make([][]int, n+1)
for v := 1; v <= n; v++ {
for _, p := range adj[v] {
if D[i][p] == D[i][v]-1 {
parents[i][v] = append(parents[i][v], p)
}
}
}
}
f := make([][]int, n+1)
for i := 1; i <= n; i++ {
f[i] = make([]int, n+1)
for j := 1; j <= n; j++ {
dist := D[i][j]
countOnPath := 0
for v := 1; v <= n; v++ {
if D[i][v]+D[j][v] == dist {
countOnPath++
}
}
if countOnPath > dist+1 {
f[i][j] = 0
continue
}
ans := 1
for v := 1; v <= n; v++ {
if D[i][v]+D[j][v] > dist {
validParents := 0
for _, p := range parents[i][v] {
if D[j][p] == D[j][v]-1 {
validParents++
}
}
ans = (ans * validParents) % MOD
if ans == 0 {
break
}
}
}
f[i][j] = ans
}
}
for i := 1; i <= n; i++ {
for j := 1; j <= n; j++ {
if j > 1 {
fmt.Fprint(writer, " ")
}
fmt.Fprint(writer, f[i][j])
}
fmt.Fprintln(writer)
}
}