#include <bits/stdc++.h>
long long gi() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) f ^= ch == '-', ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return f ? x : -x;
}
std::mt19937 rnd(time(NULL));
template <class T>
void cxk(T& a, T b) {
  a = a > b ? a : b;
}
template <class T>
void cnk(T& a, T b) {
  a = a < b ? a : b;
}
int pow(int x, int y) {
  int ret = 1;
  while (y) {
    if (y & 1) ret = 1ll * ret * x % 1000000007;
    x = 1ll * x * x % 1000000007;
    y >>= 1;
  }
  return ret;
}
template <class Ta, class Tb>
void inc(Ta& a, Tb b) {
  a = a + b >= 1000000007 ? a + b - 1000000007 : a + b;
}
template <class Ta, class Tb>
void dec(Ta& a, Tb b) {
  a = a >= b ? a - b : a + 1000000007 - b;
}
int fir[1300010], nxt[20000010], dis[20000010], w[20000010], id, cnt;
void link(int a, int b, int c) {
  nxt[++id] = fir[a], fir[a] = id, dis[id] = b, w[id] = c;
}
void Link(int a, int b, int i) {
  std::string s = std::to_string(i);
  if (i < 10)
    link(a, b, i);
  else {
    int lst = a;
    for (int i = 0; i + 1 < s.size(); ++i)
      link(lst, ++cnt, s[i] - '0'), lst = cnt;
    link(lst, b, s[s.size() - 1] - '0');
  }
}
int dist[1300010], in[1300010];
std::queue<std::vector<int>> que;
int main() {
  int n = gi(), m = gi(), x, y;
  cnt = n;
  for (int i = 1; i <= m; ++i) {
    x = gi(), y = gi();
    Link(x, y, i), Link(y, x, i);
  }
  memset(dist, -1, sizeof dist);
  que.push({1});
  dist[1] = 0;
  for (int i = 1; i <= cnt; ++i) in[i] = 1e9;
  while (!que.empty()) {
    std::vector<int> v = que.front(), t[10];
    que.pop();
    for (int x : v)
      for (int j = fir[x]; j; j = nxt[j])
        in[dis[j]] = std::min(in[dis[j]], w[j]);
    for (int x : v)
      for (int j = fir[x]; j; j = nxt[j])
        if (in[dis[j]] == w[j] && dist[dis[j]] == -1)
          dist[dis[j]] = (dist[x] * 10ll + w[j]) % 1000000007,
          t[w[j]].push_back(dis[j]);
    for (int x : v)
      for (int j = fir[x]; j; j = nxt[j]) in[dis[j]] = 1e9;
    for (int i = 0; i < 10; ++i)
      if (t[i].size()) que.push(t[i]);
  }
  for (int i = 2; i <= n; ++i) printf("%d\n", dist[i]);
  return 0;
}
