#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e6 + 5;
const long long MOD = 1e9 + 7;
int CNT;
int n, m;
vector<pair<int, int> > adj[MAXN];
int minLen[MAXN];
long long ans[MAXN];
vector<pair<int, int> > tmpStack;
long long mul(long long a, long long b) { return (a * b) % MOD; }
long long sum(long long a, long long b) { return (a + b) % MOD; }
void dfs(int pos) {
  for (pair<int, int> i : adj[pos])
    if (minLen[i.first] == minLen[pos] + 1 && ans[i.first] == -1) {
      ans[i.first] = sum(mul(ans[pos], 10), i.second);
      dfs(i.first);
    }
}
int main() {
  scanf("%d %d", &n, &m);
  CNT = n + 1;
  for (int i = 1; i <= m; ++i) {
    int u, v;
    scanf("%d %d", &u, &v);
    int tmp = i, cur = u;
    while (tmp > 0) {
      if (tmp > 9) {
        adj[CNT].push_back(pair<int, int>(cur, tmp % 10));
        cur = CNT++;
      } else {
        adj[v].push_back(pair<int, int>(cur, tmp % 10));
        cur = v;
      }
      tmp /= 10;
    }
    tmp = i, cur = v;
    while (tmp > 0) {
      if (tmp > 9) {
        adj[CNT].push_back(pair<int, int>(cur, tmp % 10));
        cur = CNT++;
      } else {
        adj[u].push_back(pair<int, int>(cur, tmp % 10));
        cur = u;
      }
      tmp /= 10;
    }
  }
  memset(minLen, -1, sizeof minLen);
  queue<int> lis;
  lis.push(1);
  minLen[1] = 0;
  while (!lis.empty()) {
    int top = lis.front();
    lis.pop();
    for (pair<int, int> i : adj[top])
      if (minLen[i.first] == -1) {
        minLen[i.first] = minLen[top] + 1;
        lis.push(i.first);
      }
  }
  for (int i = 0; i < CNT; ++i) {
    sort(adj[i].begin(), adj[i].end(), [](pair<int, int> a, pair<int, int> b) {
      return a.second < b.second;
    });
  }
  memset(ans, -1, sizeof ans);
  ans[1] = 0;
  stack<int> q, r;
  q.push(1);
  r.push(1);
  while (!q.empty()) {
    int sz = r.top();
    r.pop();
    if (sz == 0) continue;
    long long initAns;
    for (int i = 0; i < sz; ++i) {
      int tmp = q.top();
      q.pop();
      initAns = ans[tmp];
      for (pair<int, int> j : adj[tmp]) {
        if (minLen[tmp] + 1 == minLen[j.first] && ans[j.first] == -1) {
          tmpStack.push_back(j);
        }
      }
    }
    sort(
        tmpStack.begin(), tmpStack.end(),
        [](pair<int, int> a, pair<int, int> b) { return a.second < b.second; });
    stack<pair<int, int> > stck;
    for (pair<int, int> i : tmpStack)
      if (ans[i.first] == -1) {
        ans[i.first] = sum(mul(initAns, 10), i.second);
        stck.push(i);
      }
    int tmp = 10, siz = 0;
    while (!stck.empty()) {
      pair<int, int> i = stck.top();
      stck.pop();
      if (tmp != i.second) {
        r.push(siz);
        tmp = i.second;
        siz = 1;
      } else {
        siz++;
      }
      q.push(i.first);
    }
    if (siz > 0) r.push(siz);
    tmpStack.clear();
  }
  for (int i = 2; i <= n; ++i) {
    printf("%lld\n", ans[i]);
  }
}
