#include <bits/stdc++.h>
using namespace std;
long long mod = 1000000007LL;
long long large = 1000000000000000000LL;
vector<int> edge[1100000][10];
int sz;
vector<int> q[1100000];
void add(int u, int v, vector<int> t) {
  int pre = u;
  for (int i = 0; i + 1 < (int)t.size(); i++) {
    edge[pre][t[i]].push_back(sz);
    pre = sz++;
  }
  edge[pre][t.back()].push_back(v);
}
int main() {
  int n, m;
  cin >> n >> m;
  sz = n;
  for (int d = 1; d <= m; d++) {
    int x, y;
    scanf("%d%d", &x, &y);
    x--;
    y--;
    int temp = d;
    vector<int> t;
    while (temp) {
      t.push_back(temp % 10);
      temp /= 10;
    }
    reverse(t.begin(), t.end());
    add(x, y, t);
    add(y, x, t);
  }
  vector<long long> dp(1100000, -1);
  dp[0] = 0;
  int rb = 0;
  q[rb++].push_back(0);
  int it = 0;
  while (it < rb) {
    for (int j = 0; j < 10; j++) {
      int find = 0;
      for (int i = 0; i < (int)q[it].size(); i++) {
        int u = q[it][i];
        for (int k = 0; k < (int)edge[u][j].size(); k++) {
          int v = edge[u][j][k];
          if (dp[v] == -1) {
            find = 1;
            dp[v] = dp[u] * 10 + j;
            dp[v] %= mod;
            q[rb].push_back(v);
          }
        }
      }
      if (find) rb++;
    }
    it++;
  }
  for (int i = 1; i < n; i++) cout << dp[i] << endl;
  return 0;
}
