#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:640000000")
using namespace std;
const double eps = 1e-9;
const double pi = acos(-1.0);
const int maxn = (int)1e6 + 10;
const int mod = (int)1e9 + 7;
vector<pair<int, int>> g[maxn];
int pr[maxn];
int val[maxn];
bool used[maxn];
int N;
bool cmp(pair<int, int> a, pair<int, int> b) { return a.second < b.second; }
void add_edge(int u, int v, int val) {
  vector<int> dig;
  while (val > 0) {
    dig.push_back(val % 10);
    val /= 10;
  }
  reverse((dig).begin(), (dig).end());
  if ((int)(dig).size() == 1) {
    g[u].push_back(make_pair(v, dig[0]));
  } else {
    g[u].push_back(make_pair(N, dig[0]));
    N++;
    for (int i = 1; i < (int)(dig).size() - 1; i++) {
      g[N - 1].push_back(make_pair(N, dig[i]));
      N++;
    }
    g[N - 1].push_back(make_pair(v, dig[(int)(dig).size() - 1]));
  }
}
int main() {
  int n, m;
  cin >> n >> m;
  N = n;
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    --x;
    --y;
    add_edge(x, y, i + 1);
    add_edge(y, x, i + 1);
  }
  queue<vector<int>> q;
  int ID = 0;
  memset(pr, -1, sizeof(pr));
  used[0] = true;
  vector<int> start;
  start.push_back(0);
  q.push(start);
  while (!q.empty()) {
    vector<int> all = q.front();
    q.pop();
    for (int j = 0; j < (int)(all).size(); j++) {
      int v = all[j];
      for (int i = 0; i < (int)(g[v]).size(); i++) {
        int to = g[v][i].first;
        int dig = g[v][i].second;
        if (used[to] || (pr[to] != -1 && pr[to] <= dig)) continue;
        val[to] = (val[v] * 10LL + dig) % mod;
        pr[to] = dig;
      }
    }
    vector<vector<int>> out(10, vector<int>());
    for (int j = 0; j < (int)(all).size(); j++) {
      int v = all[j];
      for (int i = 0; i < (int)(g[v]).size(); i++) {
        int to = g[v][i].first;
        int dig = g[v][i].second;
        if (used[to] || pr[to] == -1) continue;
        used[to] = true;
        out[pr[to]].push_back(to);
        pr[to] = -1;
      }
    }
    for (int i = 0; i < 10; i++)
      if (!out[i].empty()) {
        q.push(out[i]);
      }
  }
  for (int i = 1; i < n; i++) cout << val[i] << endl;
  return 0;
}
