import java.util.*; public class Main { public static void main(String[] args) throws Exception{ final ContestScanner sc = new ContestScanner(); final ContestPrinter pr = new ContestPrinter(); final int N = sc.nextInt(), M = sc.nextInt(); UndirectedGraph graph = new UndirectedGraph(N); for(int m=0; m M+100) pr.println(-1); else pr.println(distance); pr.close(); } } class UndirectedGraph{ private static long INF = 1L << 60; class Edge implements Comparable{ int u,v; long length; public Edge(int u, int v, long l){ this.u = Math.min(u, v); this.v = Math.max(u, v); this.length = l; } public long getLength(){return length;} public int getLeftVertex(){return u;} public int getRightVertex(){return v;} public int getOtherVertex(int x){ return u+v-x; } public String toString(){ return String.format("[%d<->%d, %d]", u, v, length); } public int compareTo(Edge o){ return java.util.Comparator.comparingLong(Edge::getLength) .thenComparingInt(Edge::getLeftVertex) .thenComparingInt(Edge::getRightVertex) .compare(this, o); } } int V, E; java.util.List[] edge; java.util.ArrayList allEdge; public UndirectedGraph(int V){ this.V = V; this.E = 0; allEdge = new java.util.ArrayList<>(); edge = new java.util.ArrayList[V]; for(int v=0; v(); } public void addEdge(int u, int v, long length){ E++; Edge e = new Edge(u, v, length); allEdge.add(e); edge[u].add(e); edge[v].add(e); } public void addEdge(int u, int v){ addEdge(u, v, 1L); } public java.util.List getEdges(int v){return edge[v];} public java.util.List getAllEdges(){return allEdge;} public long[] dijkstra(int start){ long[] ans = new long[V]; java.util.Arrays.fill(ans, INF); java.util.PriorityQueue> queue = new java.util.PriorityQueue<>(); queue.add(new Pair<>(0L, start)); while(!queue.isEmpty()){ Pair top = queue.poll(); long d = top.getFirst(); int v = top.getSecond(); if(d > ans[v]) continue; ans[v] = d; for(Edge e: edge[v]){ if(d + e.getLength() < ans[e.getOtherVertex(v)]){ queue.add(new Pair<>(d + e.getLength(), e.getOtherVertex(v))); } } } return ans; } public long[] bellmanford(int start) throws Exception{ long[] distance = new long[V]; java.util.Arrays.fill(distance, INF); distance[start] = 0; for(int i=0; i distance[u] + l) distance[v] = distance[u] + l; } } for(Edge e: allEdge){ int u = e.getLeftVertex(), v = e.getRightVertex(); long l = e.getLength(); if(distance[v] > distance[u] + l) throw new Exception("Bellman-Ford algorithm: negative-weight cycle found"); } return distance; } public long[][] warshallfloyd(){ long[][] ans = new long[V][V]; for(int i=0; i queue = new java.util.LinkedList<>(); queue.add(start); while(!queue.isEmpty()){ int v = queue.pollFirst(); for(Edge e: getEdges(v)) if(ans[e.getOtherVertex(v)] > ans[v] + e.getLength()){ ans[e.getOtherVertex(v)] = ans[v] + e.getLength(); if(e.getLength() > 0) queue.addLast(e.getOtherVertex(v)); else queue.addFirst(e.getOtherVertex(v)); } } return ans; } public UndirectedGraph kruskal() throws Exception{ UndirectedGraph ans = new UndirectedGraph(V); java.util.Collections.sort(allEdge); DSU uf = new DSU(V); for(Edge e:allEdge){ if(!uf.same(e.getLeftVertex(), e.getRightVertex())){ uf.merge(e.getLeftVertex(), e.getRightVertex()); ans.addEdge(e.getLeftVertex(), e.getRightVertex(), e.getLength()); } } if(uf.groups().size() > 1) throw new Exception("kruskal algorithm: the graph is disconnected"); return ans; } public String toString(){return allEdge.toString();} } class Pair, T extends Comparable> implements Comparable>{ S first; T second; public Pair(S s, T t){ first = s; second = t; } public S getFirst(){return first;} public T getSecond(){return second;} public boolean equals(Object another){ if(this==another) return true; if(!(another instanceof Pair)) return false; Pair otherPair = (Pair)another; return this.first.equals(otherPair.first) && this.second.equals(otherPair.second); } public int compareTo(Pair another){ java.util.Comparator> comp1 = java.util.Comparator.comparing(Pair::getFirst); java.util.Comparator> comp2 = comp1.thenComparing(Pair::getSecond); return comp2.compare(this, another); } public int hashCode(){ return first.hashCode() * 10007 + second.hashCode(); } public String toString(){ return String.format("(%s, %s)", first, second); } } class DSU { private int n; private int[] parentOrSize; public DSU(int n) { this.n = n; this.parentOrSize = new int[n]; java.util.Arrays.fill(parentOrSize, -1); } int merge(int a, int b) { if (!(0 <= a && a < n)) throw new IndexOutOfBoundsException("a=" + a); if (!(0 <= b && b < n)) throw new IndexOutOfBoundsException("b=" + b); int x = leader(a); int y = leader(b); if (x == y) return x; if (-parentOrSize[x] < -parentOrSize[y]) { int tmp = x; x = y; y = tmp; } parentOrSize[x] += parentOrSize[y]; parentOrSize[y] = x; return x; } boolean same(int a, int b) { if (!(0 <= a && a < n)) throw new IndexOutOfBoundsException("a=" + a); if (!(0 <= b && b < n)) throw new IndexOutOfBoundsException("b=" + b); return leader(a) == leader(b); } int leader(int a) { if (parentOrSize[a] < 0) { return a; } else { parentOrSize[a] = leader(parentOrSize[a]); return parentOrSize[a]; } } int size(int a) { if (!(0 <= a && a < n)) throw new IndexOutOfBoundsException("" + a); return -parentOrSize[leader(a)]; } java.util.ArrayList> groups() { int[] leaderBuf = new int[n]; int[] groupSize = new int[n]; for (int i = 0; i < n; i++) { leaderBuf[i] = leader(i); groupSize[leaderBuf[i]]++; } java.util.ArrayList> result = new java.util.ArrayList<>(n); for (int i = 0; i < n; i++) { result.add(new java.util.ArrayList<>(groupSize[i])); } for (int i = 0; i < n; i++) { result.get(leaderBuf[i]).add(i); } result.removeIf(java.util.ArrayList::isEmpty); return result; } } class ContestScanner { private final java.io.InputStream in; private final byte[] buffer = new byte[1024]; private int ptr = 0; private int buflen = 0; private static final long LONG_MAX_TENTHS = 922337203685477580L; private static final int LONG_MAX_LAST_DIGIT = 7; private static final int LONG_MIN_LAST_DIGIT = 8; public ContestScanner(java.io.InputStream in){ this.in = in; } public ContestScanner(){ this(System.in); } private boolean hasNextByte() { if (ptr < buflen) { return true; }else{ ptr = 0; try { buflen = in.read(buffer); } catch (java.io.IOException e) { e.printStackTrace(); } if (buflen <= 0) { return false; } } return true; } private int readByte() { if (hasNextByte()) return buffer[ptr++]; else return -1; } private static boolean isPrintableChar(int c) { return 33 <= c && c <= 126; } public boolean hasNext() { while(hasNextByte() && !isPrintableChar(buffer[ptr])) ptr++; return hasNextByte(); } public String next() { if (!hasNext()) throw new java.util.NoSuchElementException(); StringBuilder sb = new StringBuilder(); int b = readByte(); while(isPrintableChar(b)) { sb.appendCodePoint(b); b = readByte(); } return sb.toString(); } public long nextLong() { if (!hasNext()) throw new java.util.NoSuchElementException(); long n = 0; boolean minus = false; int b = readByte(); if (b == '-') { minus = true; b = readByte(); } if (b < '0' || '9' < b) { throw new NumberFormatException(); } while (true) { if ('0' <= b && b <= '9') { int digit = b - '0'; if (n >= LONG_MAX_TENTHS) { if (n == LONG_MAX_TENTHS) { if (minus) { if (digit <= LONG_MIN_LAST_DIGIT) { n = -n * 10 - digit; b = readByte(); if (!isPrintableChar(b)) { return n; } else if (b < '0' || '9' < b) { throw new NumberFormatException( String.format("%d%s... is not number", n, Character.toString(b)) ); } } } else { if (digit <= LONG_MAX_LAST_DIGIT) { n = n * 10 + digit; b = readByte(); if (!isPrintableChar(b)) { return n; } else if (b < '0' || '9' < b) { throw new NumberFormatException( String.format("%d%s... is not number", n, Character.toString(b)) ); } } } } throw new ArithmeticException( String.format("%s%d%d... overflows long.", minus ? "-" : "", n, digit) ); } n = n * 10 + digit; }else if(b == -1 || !isPrintableChar(b)){ return minus ? -n : n; }else{ throw new NumberFormatException(); } b = readByte(); } } public int nextInt() { long nl = nextLong(); if (nl < Integer.MIN_VALUE || nl > Integer.MAX_VALUE) throw new NumberFormatException(); return (int) nl; } public double nextDouble() { return Double.parseDouble(next()); } public long[] nextLongArray(int length){ long[] array = new long[length]; for(int i=0; i