#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e9;
const long long N = 2e6 + 100;
const long long mod = 1e9 + 7;
map<pair<long long, long long>, long long> m;
vector<pair<long long, long long> > e[N];
long long c[N], sum[N];
long long top, top1;
bool use[N];
long long f(long long x, long long c) {
  if (m[{x, c}] == 0) m[{x, c}] = ++top1;
  return m[{x, c}];
}
void solve() {
  long long i, j, k, n, a, b;
  cin >> n >> k;
  top = n;
  for (i = 1; i <= k; ++i) {
    cin >> a >> b;
    long long ls = b;
    long long x = i;
    vector<long long> cifr;
    while (x > 0) {
      cifr.push_back(x % 10);
      x /= 10;
    }
    x = i;
    long long y = 0;
    while (x > 9) {
      long long u = ++top;
      e[u].push_back({ls, cifr[y]});
      e[ls].push_back({u, cifr[cifr.size() - y - 1]});
      ls = u;
      x /= 10;
      ++y;
    }
    e[a].push_back({ls, cifr[cifr.size() - 1]});
    e[ls].push_back({a, cifr[0]});
  }
  vector<long long> v = {1};
  c[1] = 1;
  top1 = 1;
  i = 0;
  while (i < v.size()) {
    j = i;
    while (j < v.size() && c[v[j]] == c[v[i]]) ++j;
    for (long long p = 0; p < 10; ++p)
      for (long long l = i; l < j; ++l)
        for (long long h = 0; h < e[v[l]].size(); ++h)
          if (e[v[l]][h].second == p && !use[e[v[l]][h].first]) {
            use[e[v[l]][h].first] = 1;
            v.push_back(e[v[l]][h].first);
            c[e[v[l]][h].first] = f(c[v[l]], p);
            sum[e[v[l]][h].first] = (sum[v[l]] * 10 + p) % mod;
          }
    i = j;
  }
  for (i = 2; i <= n; ++i) cout << sum[i] << "\n";
}
signed main() { solve(); }
