#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100001;
const long long int INF = 1e16;
const long long int MOD = 1000000007;
vector<pair<int, int> > adj[MAX_N];
vector<pair<int, string> > adj2[MAX_N];
priority_queue<pair<int, int>, vector<pair<int, int> >,
               greater<pair<int, int> > >
    pq;
int vis[MAX_N];
long long int D[MAX_N];
long long int ans[MAX_N];
struct node {
  long long int val;
  vector<int> V;
  node* nxt[10];
};
void build(node* p, pair<int, string>& T, int i) {
  if (i == T.second.length()) {
    p->V.push_back(T.first);
    return;
  }
  int t = T.second[i] - '0';
  if (p->nxt[t] == nullptr) {
    p->nxt[t] = new node();
    p->nxt[t]->val = (p->val * 10 + t) % MOD;
    for (int i = 0; i < 10; i++) p->nxt[t]->nxt[i] = nullptr;
  }
  build(p->nxt[t], T, i + 1);
}
void dfs(node* p) {
  for (auto u : p->V) {
    if (vis[u]) continue;
    ans[u] = p->val;
    vis[u] = 1;
    for (auto T : adj2[u]) {
      build(p, T, 0);
    }
  }
  for (int i = 0; i < 10; i++)
    if (p->nxt[i] != nullptr) dfs(p->nxt[i]);
}
int main() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].emplace_back(v, i);
    adj[v].emplace_back(u, i);
  }
  for (int i = 1; i <= n; i++) {
    vis[i] = 0;
    D[i] = INF;
  }
  D[1] = 0;
  pq.emplace(0, 1);
  while (!pq.empty()) {
    int u = pq.top().second, d = pq.top().first;
    pq.pop();
    if (vis[u]) continue;
    vis[u] = 1;
    for (auto T : adj[u]) {
      int v = T.first, len = to_string(T.second).length();
      if (vis[v]) continue;
      if (D[v] > D[u] + len) {
        D[v] = D[u] + len;
        pq.emplace(D[v], v);
      }
    }
  }
  for (int u = 1; u <= n; u++) {
    for (auto T : adj[u]) {
      int v = T.first, len = to_string(T.second).length();
      if (D[v] < D[u] + len) continue;
      adj2[u].emplace_back(v, to_string(T.second));
    }
  }
  for (int i = 1; i <= n; i++) vis[i] = 0;
  node* root = new node();
  root->val = 0;
  root->V.push_back(1);
  for (int i = 0; i < 10; i++) root->nxt[i] = nullptr;
  dfs(root);
  for (int i = 2; i <= n; i++) cout << ans[i] << "\n";
}
