public void run() {
		boolean hasUpdate = true;

		while (hasUpdate) {
			hasUpdate = false;

			Set<String> keys = new HashSet<String>(this.r.keySet());
			for (String rkey : keys) {
				double ru = this.r.get(rkey);

				try {
					BufferedReader reader = new BufferedReader(
							new InputStreamReader(new FileInputStream(
									this.graphPathStr)));

					String line = null;
					boolean notfound = true;
					while ((line = reader.readLine()) != null) {
						String[] fields = line.split("\t");
						String ukey = fields[0];

						if (ukey.compareTo(rkey) == 0) {
							int len = fields.length;
							int outdegree = len - 1;

							if (outdegree == 0
									|| ru / (double) outdegree <= EPSILON)
								continue;

							this.push(fields);

							hasUpdate = true;
							notfound = false;
							break;
						}
					}

					if (notfound) {
						this.push(new String[] { rkey });
					}
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}