package main
import (
"bufio"
"io"
"os"
"strconv"
)
const MOD int64 = 998244353
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
nextInt := func() int {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
idx++
}
val := 0
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
val = val*10 + int(data[idx]-'0')
idx++
}
return val
}
n := nextInt()
m := nextInt()
g := make([][]int, n)
for i := 0; i < m; i++ {
a := nextInt() - 1
b := nextInt() - 1
g[a] = append(g[a], b)
g[b] = append(g[b], a)
}
var dist [400][400]int16
var q [400]int
for s := 0; s < n; s++ {
for i := 0; i < n; i++ {
dist[s][i] = -1
}
head, tail := 0, 0
q[tail] = s
tail++
dist[s][s] = 0
for head < tail {
v := q[head]
head++
dv := dist[s][v]
for _, to := range g[v] {
if dist[s][to] == -1 {
dist[s][to] = dv + 1
q[tail] = to
tail++
}
}
}
}
var ans [400][400]int64
for i := 0; i < n; i++ {
dx := dist[i][:n]
for j := i; j < n; j++ {
dy := dist[j][:n]
dxy := dx[j]
pathCount := 0
for v := 0; v < n; v++ {
if dx[v]+dy[v] == dxy {
pathCount++
}
}
var res int64
if pathCount == int(dxy)+1 {
res = 1
for v := 0; v < n; v++ {
if dx[v]+dy[v] == dxy {
continue
}
cnt := 0
for _, u := range g[v] {
if dx[u]+1 == dx[v] && dy[u]+1 == dy[v] {
cnt++
}
}
res = res * int64(cnt) % MOD
if res == 0 {
break
}
}
}
ans[i][j] = res
ans[j][i] = res
}
}
w := bufio.NewWriterSize(os.Stdout, 1<<20)
defer w.Flush()
line := make([]byte, 0, n*12)
for i := 0; i < n; i++ {
line = line[:0]
for j := 0; j < n; j++ {
if j > 0 {
line = append(line, ' ')
}
line = strconv.AppendInt(line, ans[i][j], 10)
}
line = append(line, '\n')
w.Write(line)
}
}