#include<iostream>
#include<string>
using namespace std;
//本题坑点:会重复输入边,本题以第一次输入为准,切忌覆盖
//方法:高精度运算和弗洛伊德
//注意:是无向图
//高精度乘法
//999999999999999999999*2
string mul(string s, int a)
{
	string res = "";
	int carry = 0;
	res = s;
	for (int i = s.length()-1; i >= 0; i--)
	{
		res[i] = ((s[i] - '0') * a + carry) % 10+'0';
		carry = ((s[i] - '0') * a + carry) / 10;
	}
	if (carry > 0)
	{
		res.insert(0, 1, carry + '0');
	}
	return res;
}
//高精度加法
string add(string a, string b)
{
	string res = "";
	int d = a.length() - b.length();
	if (d > 0)
	{
		b.insert(0, d, '0');
	}
	else if(d<0)
	{
		a.insert(0, -d, '0');
	}
	res = a;
	int carry = 0;//进位
	for (int i = a.length() - 1; i >= 0; i--)
	{
		res[i] = char((a[i] - '0' + b[i] - '0' + carry) % 10+'0');
		carry = (a[i] - '0' + b[i] - '0' + carry) / 10;
	}
	if (carry > 0) res.insert(0, 1, carry + '0');
	return res;
}
//比大小(不是字符串大小,而是字符串代表的整数的大小)
//a>b返回true
bool isgreater(string a, string b)
{
	if (a.length() > b.length()) return true;
	else if (a.length() < b.length()) return false;
	else
	{
		for (int i = 0; i < a.length(); i++)
		{
			if (a[i] > b[i]) return true;
			if (a[i] < b[i])return false;
			if (a[i] == b[i])continue;
		}
	}
	return false;
}
int main()
{
	//string s1 = "88888";
	//string s2 = "22";
	////测试高精度乘法
	//cout<<mul(s1, 2)<<endl;
	////测试高精度加法
	//cout << add(s1, s2);
	int cities, roads;
	int from, to;
	//初始化图
	string g[100][100];
	for (int i = 0; i < 100; i++)
		for (int j = 0; j < 100; j++)
			g[i][j] = "INF";//表示此路不通
	while(cin >> cities >> roads)
	{
		//输入边
		string s="1";//第一条边的距离是1
		for (int i = 0; i < roads; i++)
		{
			cin >> from >> to;
			if (i!= 0)
			{
				s = mul(s, 2);
			}
            if(g[from][to]=="INF")//之所以加这个是因为会有重复输入,题目以第一次输入为准
			    g[from][to]= g[to][from] = s;
		}
	}
	//开始弗洛伊德
	for (int k = 0; k < cities; k++)
	{
		for (int i = 0; i < cities; i++)
		{
			for (int j = 0; j < cities; j++)
			{
                if(i==j) continue;
				if (g[i][k] == "INF" || g[k][j] == "INF") continue;
				if (g[i][j] == "INF"||isgreater(g[i][j], add(g[i][k], g[k][j])))
				{
					g[i][j]= add(g[i][k], g[k][j]);
				}
			}
		}
	}
	//处理输出
	for (int i = 1; i < cities; i++)
	{
		if (g[0][i] == "INF") cout << "-1" << endl;
		else if (g[0][i].length() > 5) cout << stoi(g[0][i].substr(g[0][i].length() - 5)) << endl;
		else cout << stoi(g[0][i]) << endl;
	}
}