#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
const int M = 200005;
const int MAX_VERTEX = N * 5 * 2;
const int MOD = 1e9 + 7;
int vertexCount;
vector<pair<int, int>> adj[MAX_VERTEX];
int start[N];
int dist[MAX_VERTEX];
int n, m;
pair<int, int> elist[M];
void addEdge(int from, int to, int w) { adj[from].push_back({to, w}); }
void read() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d %d", &elist[i].first, &elist[i].second);
  }
}
void createExtendedGraph() {
  for (int i = 1; i <= n; i++) {
    start[i] = vertexCount++;
  }
  for (int i = 1; i <= m; i++) {
    vector<int> digits;
    int j = i;
    while (j > 0) {
      digits.push_back(j % 10);
      j /= 10;
    }
    reverse(digits.begin(), digits.end());
    for (int it = 0; it < 2; it++) {
      int cur = start[elist[i].first];
      for (int j = 0; j + 1 < digits.size(); j++) {
        int nex = vertexCount++;
        addEdge(cur, nex, digits[j]);
        cur = nex;
      }
      addEdge(cur, start[elist[i].second], digits.back());
      swap(elist[i].first, elist[i].second);
    }
  }
}
void prepare() {
  createExtendedGraph();
  memset(dist, -1, sizeof dist);
  dist[start[1]] = 0;
}
vector<vector<int>> processEquivalentVertices(vector<int> vertices) {
  int val = dist[vertices[0]];
  val = 10ll * val % MOD;
  vector<int> orders[10];
  for (int v : vertices) {
    for (pair<int, int> edge : adj[v]) {
      orders[edge.second].push_back(edge.first);
    }
  }
  vector<vector<int>> ret;
  for (int i = 0; i < 10; i++) {
    vector<int> equivalentVerts;
    for (int x : orders[i]) {
      if (dist[x] == -1) {
        dist[x] = (val + i) % MOD;
        equivalentVerts.push_back(x);
      }
    }
    if (!equivalentVerts.empty()) {
      ret.push_back(equivalentVerts);
    }
  }
  return ret;
}
void work() {
  queue<vector<int>> q;
  q.push({start[1]});
  while (!q.empty()) {
    vector<int> cur = q.front();
    q.pop();
    vector<vector<int>> equivalentVerts = processEquivalentVertices(cur);
    for (vector<int> x : equivalentVerts) {
      q.push(x);
    }
  }
  for (int i = 2; i <= n; i++) {
    printf("%d\n", dist[start[i]]);
  }
}
int main() {
  read();
  prepare();
  work();
  return 0;
}
