#include <bits/stdc++.h>
using namespace std;
const int N = 500001, mod = 1000000000 + 7;
struct node {
  map<char, int> nxt;
} t[N];
vector<pair<int, int> > adj[N];
queue<int> q[N];
int d[N], leaf[N], ptr, par[19][N], lvl[N], val[N];
int add(int v, string str) {
  for (auto &ch : str) {
    if (!t[v].nxt.count(ch)) t[v].nxt[ch] = ++ptr;
    int u = v;
    v = t[v].nxt[ch];
    lvl[v] = lvl[u] + 1;
    val[v] = (1LL * val[u] * 10 + 1LL * (ch - '0')) % mod;
    par[0][v] = u;
    for (int i = 1; i < 19; i++) par[i][v] = par[i - 1][par[i - 1][v]];
  }
  return v;
}
int lca(int u, int v) {
  int ux = u, vx = v;
  for (int i = 18; i >= 0; i--)
    if (par[i][v] ^ par[i][u]) {
      v = par[i][v];
      u = par[i][u];
    }
  int x = par[0][v];
  for (char i = '0'; i <= '9'; i++) {
    if (t[x].nxt.count(i) && t[x].nxt[i] == u) return ux;
    if (t[x].nxt.count(i) && t[x].nxt[i] == v) return vx;
  }
  return ux;
}
int32_t main() {
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].push_back(make_pair(v, i));
    adj[v].push_back(make_pair(u, i));
  }
  d[1] = 1;
  q[1].push(1);
  for (int i = 1; i < N; i++) {
    while (!q[i].empty()) {
      int v = q[i].front();
      q[i].pop();
      if (d[v] < i) continue;
      for (auto [u, j] : adj[v])
        if (!d[u] || d[u] > d[v] + to_string(j).size()) {
          d[u] = d[v] + to_string(j).size();
          q[d[u]].push(u);
        }
      for (auto [u, j] : adj[v])
        if (d[v] == d[u] + to_string(j).size()) {
          int k = add(leaf[u], to_string(j));
          if (!leaf[v]) {
            leaf[v] = k;
          } else {
            leaf[v] = lca(leaf[v], k);
          }
        }
    }
  }
  for (int i = 2; i <= n; i++) cout << val[leaf[i]] << endl;
}
